• 两个Activity传递数据和对象


    (1)首先是Activity的简单跳转

     

              Activity的切换一般是通过Intent来实现的,Intent是一个Activity到达另一个Activity的引路者,它描述了起点(当前Activity)和终点(目标Activity)。一个简单Intent实现如下:

    1. Intent intent = new Intent(); //创建一个Intent对象
    2. intent.setClass(activity1.this, activity2.class); //描述起点和目标
    3. startActivity(intent);


          (2)通常,我们在Activity的切换中,希望把前一个Activity的某些数据传递给下一个Activity

            这时,我们可以借助Bundle来实现。Bundle相当于数据存储包,用于存放我们想要转达的数据。打个比方,Intent就像一封邮件,里面有送信人地址(原始Activity),也有收信人地址(目标Activity),而Bundle就是附件也可看做是信件内容。下面是它的简单实现:

              a、Activity1发送

    1. Intent intent = new Intent();
    2. intent.setClass(activity1.this, activity2.class); //描述起点和目标
    3. Bundle bundle = new Bundle(); //创建Bundle对象
    4. bundle.putString("something", "Activity1发来的数据"); //装入数据
    5. intent.putExtras(bundle); //把Bundle塞入Intent里面
    6. startActivity(intent);
            b、Activity2接受从Activity1发来的数据
    1. Intent intent = this.getIntent(); //获取已有的intent对象
    2. Bundle bundle = intent.getExtras(); //获取intent里面的bundle对象
    3. string = bundle.getString("something");


         (3)如何接受从目标Activity返回的处理结果

           有两种方式,一是在onRestart方法(onRestrart表示重启Activity时激发的事件)里面接受处理结果,方法实现和Activity2接受从Activity1发来的数据处理一样。另一种方式,是采用应答模式切换。这里,主要讲下第二种方式。应答模式切换和普通的切换不同在于,普通的是有去没回,应答则是有来有往。代码实现也不一样:1、从Activity1切换到Activity2:startActivityForResult(intent,0);2、从Activity2返回到Activity1:setResult(RESULT_OK, intent)。3、接受返回结果:protected void onActivityResult()。具体代码如下;

               a、从Activity1切换到Activity2

    1. Intent intent = new Intent();
    2.  intent = intent.setClass(ActivityIntent.this, AnotherActivity.class);
    3.  Bundle bundle = new Bundle();
    4.  bundle.putString("string", et_string.getText().toString());
    5.  intent.putExtras(bundle);
    6.  startActivityForResult(intent,0); //只有这里不同
    7.   
            b、从Activity2返回到Activity1
    1. Intent intent = new Intent();
    2. intent = intent.setClass(AnotherActivity.this, ActivityIntent.class);
    3. Bundle bundle = new Bundle();
    4. bundle.putInt("result", "Activity2的处理结果");
    5. intent.putExtras(bundle); 
    6. AnotherActivity.this.setResult(RESULT_OK, intent); //RESULT_OK是返回状态码
    7. AnotherActivity.this.finish();
             c、Activity1接受Activity2的返回结果
    1. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    2.                    super.onActivityResult(requestCode, resultCode, data);
    3.                     switch(resultCode) { //根据状态码,处理返回结果
    4.                     case RESULT_OK: 
    5.                           Bundle bundle =data.getExtras(); //获取intent里面的bundle对象
    6.                               String result = bundle.getInt("result"); 
    7.                     break; 
    8.                     default:
    9.                     break;
    10.                     } 
    11.              }


          (4)保存Activity离开前的数据

           从Activity2中返 回到Activity1(在Activity1切换到Activity2时,调用了finish方法),你会发现你在Activity1以前的数据全没 了,简单的说就是数据被没有保留下来。因为finish方法,会触发onDestroy(),使得Activity1销毁。下一次再来到 Activity1时,是全新的Activity1,以往的数据当然不在。如果想保留切换前的状态,可以采用两种方式:1、切换时,不调用 finish()方法。2、采用SharedPreferences来保存数据。SharedPreferences 是一个轻量级存储类,主要用于保存一些窗体的状态,如文本框值、按钮状态等等,类似于Session。一般在onPause()方法里面保存数据,在onResume()里面提取数据。实现如下:

             a、保存数据

    1. //暂停:onStart()->onResume()->onPause()
    2.     @Override    
    3.     protected void onPause() {        
    4.         super.onPause();
    5.         Log.e("Lifecycle_Activity1", "onPause()");
    6.         
    7.         //把数据保存到类似于Session之类的存储集合里面
    8.         SharedPreferences.Editor saveData = getPreferences(0).edit();
    9.         saveData.putString("value", et_string.getText().toString());
    10.         saveData.commit();
    11.     }
           b、提取数据
    1. //重启:onStart()->onResume()
    2.     @Override    
    3.     protected void onResume() {        
    4.         super.onResume();
    5.         Log.e("Lifecycle_Activity1", "onResume()");
    6.         
    7.         //从共享数据存储对象中获取所需的数据
    8.         SharedPreferences getData = getPreferences(0);
    9.         String value = getData.getString("value", null);
    10.         if(value != null) {
    11.             et_string.setText(value);
    12.         }
    13.     }
     
  • 相关阅读:
    大数据-数据分析-numpy库-数组的深拷贝和浅拷贝
    windows环境下mysql主从配置
    C#定时发送邮箱设置
    论《LEFT JOIN条件放ON和WHERE后的区别》
    记录成长
    RobotFramework+Selenium如何提高脚本稳定性
    Jekins 插件Extended Choice Parameter显示Json Parameter Type遇到的问题
    nGrinder 参数使用
    Jenkins REST API 实例
    java ee config / nacos / shit Alibaba Middleware
  • 原文地址:https://www.cnblogs.com/guiqw/p/5053383.html
Copyright © 2020-2023  润新知