首页 > 代码库 > Android Activity 回传值

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来表示状态。

Android Activity 回传值