標籤:android style blog io ar color sp for 資料
記錄一下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 回傳值