zoukankan      html  css  js  c++  java
  • Intent数据传递

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

      1)、Activity的切换一般是通过Intent来实现的,Intent是一个Activity到达另一个Activity的引路者,它描述了起点(当前Activity)和终点(目标Activity)。一个简单Intent实现如下: (个人计较喜欢直接定义的方式  ) 

    Intent intent = new Intent();                           //创建一个Intent对象   
    intent.setClass(activity1.this, activity2.class);   //描述起点和目标   
    startActivity(intent);                                     //开始跳转 
    
    //或者直接使用
    intent = (Intent) new Intent(activity1.this,activity2.class)

      2)、通常,我们在Activity的切换中,希望把前一个Activity1的某些数据传递给下一个Activity2。这时,我们可以借助Bundle来实现。Bundle,相当于数据存储包,用于存放我们想要转达的数据。打个比方,Intent就像一封邮件,里面有送信人地址(原始Activity),也有收信人地址(目标Activity),而Bundle就是附件也可看做是信件内容。下面是它的简单实现:

        a、Activity1发送:    

    Intent intent = new Intent();   
    intent.setClass(activity1.this, activity2.class);   //描述起点和目标   
    Bundle bundle = new Bundle();                           //创建Bundle对象   
    bundle.putString("something", "Activity1发来的数据");     //装入数据   
    intent.putExtras(bundle);                                //把Bundle塞入Intent里面   
    startActivity(intent);                                     //开始切换 

       b、Activity2接受从Activity1发来的数据:

    Intent intent = this.getIntent();        //获取已有的intent对象   
    Bundle bundle = intent.getExtras();    //获取intent里面的bundle对象   
    string = bundle.getString("something");    //获取Bundle里面的字符串

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

               a、从Activity1切换到Activity2:  

    Intent intent = new Intent();    
    intent = intent.setClass(ActivityIntent.this, AnotherActivity.class);    
    Bundle bundle = new Bundle();    
    bundle.putString("string", et_string.getText().toString());    
    intent.putExtras(bundle);    
    startActivityForResult(intent,0);       //只有这里不同    
     //ActivityIntent.this.finish();  //不能用finish,会触发onDestroy();  

        b、从Activity2返回到Activity1:

    Intent intent = new Intent();   
    intent = intent.setClass(AnotherActivity.this, ActivityIntent.class);   
    Bundle bundle = new Bundle();   
    bundle.putInt("result", "Activity2的处理结果");   
    intent.putExtras(bundle);       
    AnotherActivity.this.setResult(RESULT_OK, intent);   //RESULT_OK是返回状态码   
    AnotherActivity.this.finish(); //会触发onDestroy();  

      c、Activity1接受Activity2的返回结果:  

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {    
                       super.onActivityResult(requestCode, resultCode, data);    
                        switch(resultCode) { //根据状态码,处理返回结果    
                        case RESULT_OK:     
                              Bundle bundle =data.getExtras();   //获取intent里面的bundle对象    
                                  String result = bundle.getInt("result");     
                        break;       
                        default:    
                        break;    
                        }         
       
                 } 

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

             a、保存数据    

    //暂停:onStart()->onResume()->onPause()    
        @Override       
        protected void onPause() {          
            super.onPause();    
            Log.e("Lifecycle_Activity1", "onPause()");    
                
            //把数据保存到类似于Session之类的存储集合里面    
            SharedPreferences.Editor saveData = getPreferences(0).edit();    
            saveData.putString("value", et_string.getText().toString());    
            saveData.commit();    
        }  

      b、提取数据

    //重启:onStart()->onResume()    
        @Override       
        protected void onResume() {         
            super.onResume();    
            Log.e("Lifecycle_Activity1", "onResume()");    
                
            //从共享数据存储对象中获取所需的数据    
            SharedPreferences getData = getPreferences(0);    
            String value = getData.getString("value", null);    
            if(value != null) {    
                et_string.setText(value);    
            }    
        } 
  • 相关阅读:
    swift开发之--可选类型说明,类型判断 is 与类型转换 as
    壹佰文章最全总结| 《关于ASP.NETCore的分享之路》
    Blog.Core 项目已完成升级.NET5.0
    BCVP,想真正为社区做努力的开发者们
    centos7 安装 certbot 动态更新Let's encrypt 证书实现nginx免费ssl证书
    CentOS 7.5 安装 CDH6.3.2
    cloud-init在centos中关于静态ip和hostname的配置
    wait为什么要在同步块中使用? 为什么sleep就不用再同步块中?
    Java字节码技术 static、final、volatile、synchronized关键字的字节码体现 转
    说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景 转
  • 原文地址:https://www.cnblogs.com/plxx/p/3821103.html
Copyright © 2011-2022 走看看