记录一下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来表示状态。