Android Activity 回传值

记录一下Activity往上级回传值的一些心得,及疑问。

需求: Activity A -> Activity B,并把一个Object instance(p) 传给B,Activity B 中,p的一些数据会实时更新,当用户返回A 时,需要把p带回给A,

 

方法 1  startActivityForResult()

A 中:

Intent intent = new Intent(this, B.class);
intent.putExtra("key",value);
startActivityForResult(intent,Request_Code);

*注意: Activity B 不能用 (singleTask)启动,不然A会直接受到Result_Cancel,从而无法有返回值。

A中加入callback method: onActivityResult(),需要对requestCode and resulteCode 进行判断。

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

      switch(resultCode){
        case Activity.RESULT_CANCELED:{}
        case Activity.RESULT_OK: {
          if (requestCode==Request_Code){
            P p = data.getParcelableExtra("panel");
          }
        }
        default: ...
      }


}    

Activity B 中:设置给activity左上角的<Home  以及 Back button: onBackPressed() 中设置回传

public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case android.R.id.home:
                Intent intent = NavUtils.getParentActivityIntent(this);   //get inent
                intent.putExtra("key",p);                     //put in p instance     
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);       //set intent flag

                setResult(Activity.RESULT_OK,intent);             //set resultCode and intent
                finish();
                return true;
            
             default:   return super.onOptionsItemSelected(item);
        }
    }                    

这样按下返回Home或Back后,会调用 A中 的onResultActivity() callback, A就能接收到 p (implements Parcable) 

 

方法2: 用onNewIntent(),不需要检测request_code 和result_code

A 中: startActivity(intent, B.class);

并添加callback  onNewIntent()

        @Override
    protected void onNewIntent(Intent intent) {
        
        setIntent(intent);
        Intent newIntent = getIntent();
      
        ...
        super.onNewIntent(intent);
        
    }    

 

B 中: 

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra(...);
NavUnit.navigateUpTo(this,intent);

A会得到一个新的intent。


总结: startActivity() 和 startActivityForResult() 都可以得到得到回传值,但回传之后的callback 不同,前者用onNewIntent(),后者用onResultActivity()。后者可以用requestCode来控制不同的传递,用resultCode来表示状态。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。