項目開發中遇到一個問題,由ActivityA跳轉到ActivityB時,如果ActivityB設定了launchMode,并且B界面finish時需要傳回給ActivityA一些資料,這時候ActivityA對于ActivityB的onActivityResult()方法可能會出現一些問題。下面寫一個簡單的小demo來驗證一下。
A中有一個按鈕進行界面跳轉到B,
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(A.this,B.class);
startActivityForResult(intent,REQUST_CODE);
}
});
B中按鈕finish,傳回A界面。
finish.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("test", "data from B");
setResult(RESULT_OK,intent);
finish();
}
});
最後在A中進行處理,
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode==RESULT_OK){
String result=data.getStringExtra("test");
Toast.makeText(getApplicationContext(),"RESULT_OK "+result,Toast.LENGTH_SHORT).show();
}
if (resultCode==RESULT_CANCELED){
Toast.makeText(getApplicationContext(),"RESULT_CANCELED",Toast.LENGTH_SHORT).show();
}
}
關于launchMode就不詳細講解了,這裡簡單說一下。
standard:預設的啟動模式,每次啟動都會在目前棧中重新生成一個新的 Activity執行個體。
singleTop:啟動時先去檢查棧頂是不是目前Activity執行個體,是的則直接使用,不 是的就重新建立。
singleTask:保證目前棧中隻有自己的一個執行個體,通常的做法是,如果在棧中發現了自己的Activity執行個體,就将這個執行個體之上的其他Activity執行個體統統趕走,使自己成為棧頂。
singleInstance:這個模式最霸道,會重建立一個棧,把自己的Activity執行個體放進去,并且不會再放入其他Activity執行個體。
先測試一下standard模式,清單檔案ActivityB中加入
android:launchMode="standard"
,斷點調試。點選A中按鈕,跳轉到B,點選B中按鈕,進入斷點,如下圖所示,這是A成功收到B傳回過來的資料,standard模式啟動Activity對onActivityResult沒有影響。

接下來以同樣的方式測試singleTop模式,測試結果與standard模式一樣,這裡不再贅述。
接着将B的啟動模式改為singleTask繼續斷點測試,這次結果就比較出人意料,與之前有很大差別。當我點選A中跳轉按鈕時,就直接進入了onActivityResult中的斷點,注意這裡進入斷點的時間,并不是點選B中finish按鈕後才進入斷點。這裡我就産生了一個疑惑,當我點選按鈕去進行跳轉按鈕之後,是不是壓根就沒有進入B界面。為了驗證一下這個問題,我在B界面的onCreate()方法上也打上斷點,來看一下代碼的執行順序。這次,當我點選A中按鈕後。首先執行的依然是A中的onActivityResult方法,那麼此時的resultCode是多少呢?請注意看下圖,
可以看到此時的resultCode是一個值為0的常量,RESULT_CANCELED,是以這樣是完全沒有辦法接收資料的,也就是在調用startActivityForResult()之後就直接調用了onActivityResult(),并給出了一個值為0的結果碼。至于具體原因,暫時還沒有想到比較合理的解釋,哪位大牛知道原因的和小弟說道說道。
最後來測試一下singleInstance模式,發現和singleTask模式一樣。
是以,如果當你要跳轉的Activity的啟動模式為singleTask或者singleInstance時,會導緻跳轉前Activity無法收到跳轉後Activity傳回的資料,在這裡要注意一下。