更新:可先看此文章:http://www.lxweimin.com/p/7572097eccf1
今天在測試的時候,發現了一個問題:
概述:fragment調用startActivityForResult來啟動新的Activity,發現fragment的onActivityResult被提前調用,并且在新的activity被finish掉以后沒有回調fragment的onActivityResult方法,導致異常
理想情況:在一個fragment中使用了startActivityForResult()方法來啟動一個新的Activity(就叫作Activity_1),在Activity_1中選擇了數據項,再將結果帶回到原來的fragment中,并顯示出來。
BUG描述:1、(測試機,真機Android 4.3,API 18)在Activity_1選擇完數據項后,并沒有將新的數據顯示到fragment中,而且使用Log發現,Activity_1被finish掉以后沒有調用fragment的onActivityResult()
2、除此以外,我還注意到了一個很詭異的細節,在啟動Activity_1之前,會調用一次fragment的onActivityResult()方法,在Activity_1被我手動finish()掉以后反而不會觸發fragment的onActivityResult()方法
3、虛擬機(Nexus 5, API 23)不存在這個問題
問題所在:原來我在以前將Activity_1的啟動方式設置為“singleTask”,導致了問題的發生。
原因:
在singleTask、singleInstance兩個模式下,onActivityResult方法會立即調用,等到再setResult的時候,就不再起作用了
(from http://my.oschina.net/u/1463920/blog/307402)
講道理,我更傾向于把這個問題歸因為Android的一個BUG,因為在更高的API中,是不存在這個問題的,就是說后期Android的程序員將這個BUG修復了,所以這個BUG產生的原因我就不去深究了(其實我嘗試過,但除了看到了stratActivity的一些流程以外別無所獲)
解決辦法:
1、將新開的Activity(即上文舉例的Activity_1)的launchMode設為默認即可;
2、(未實際驗證,但應該只適用于Activity )
正確的做法是,在A中監聽方法onNewIntent(Intent intent),然后B或C返回A的方式應該是:
Intent intent = new Intent(B.this,A.class);
intent.putExtra("flag","1");
startActivty(intent);這樣啟動A的話,onNewIntent會被監聽到,參數Intent就包含了 傳遞的數據,這里注意的是當調用onNewIntent()時,A中的UI組件已經加載完畢,更新UI的寬度高度等是沒
有問題的。(from http://my.oschina.net/u/1463920/blog/307402)