人員都知道,可以經由過程應用 startActivityForResult() 和 onActivityResult() 辦法來傳遞或接管參數。
然而在“輕聽”項目中,還沒比及被調用的 Activity 返回,onActivityResult() 就被履行了。
找了好久,終於經由過程小道消息得知,這與 Activity 的加載模式(launchMode)有關,該屬性可以在 AndroidManifest.xml 中設置。
本來將其設為 singleInstance,經測試,所有須要傳遞或接管的 Activity 不容許設置該屬性,或只能設為標准模式,不然體系將在 startActivityForResult() 后直接調用 onActivityResult()。
調用startActivityForResult后,onActivityResult無響應的題目
兩個activity傳遞數據和返回數據時,懇求方的onActivityResult始終無響應,經由過程debug調試模式也沒見調用該辦法。查看了各類設備和法度代碼,均未發明有錯誤之處。后面找了很多材料,總算看到一個伴侶說是調用startActivityForResult的參數題目,即調用時如許:
startActivityForResult(intent, 0);
是第二個參數的題目,該參數必須大於0才干在返回值,並激活onActivityResult辦法。
我最開端是用的一個activity默認的常量:RESULT_OK,跟蹤了代碼后發明,該常量的值為-1,當然沒法激活 onActivityResult辦法了,隨后隨便批改為一個大於0的整數,法度即通跑成功。
startActivityForResult(intent, 1); //如許就行了
1.startActivityForResult(Intent intent, Int requestCode);
2.setResut(int resultCode, Intent intent);
3.onActivityResult(int requestCode, int resultCode, Intent intent);
重視事項:
1.比來應用startActivityForResult,失足,跟蹤后發明activity並沒有被啟動,而是直接履行 onActivityResult。后查看日記發明
“05-19 02:11:19.822: WARN/ActivityManager(67): Activity is launching as a new task, so cancelling activity result.”
本來是我把要啟動的activity的launchmode設置成singleTask了。
把目標activity的launchmode去掉,正確。
總結:目標activity的launchmode不克不及設置成singleTask。
2.requestCode值>=0,不然,startActivityForResult就變成了 startactivity
從SDK我們可以看到如下深奧的解釋:http://developer.android.com/guide/topics/manifest/activity-element.html#lmode
The other modes — singleTask and singleInstance — are not appropriate for most applications, since they result in an interaction model that is likely to be unfamiliar to users and is very different from most other applications.
從柯元旦的《Android 內核剖析》的第十章“Ams內部原理“10.1.3中有這樣的一段話:請注意:SINGLE_TASK標識以及SINGLE_INSTANCE兩個標識必須在r.result==0的條件中,即這兩個標識只能用在startActivity()的方法中,而不能使用在startActivityForResult方法中。因為從Task的角度看,Android認為不同Task之間的Activity是不能傳遞數據的,所以不能使用NEW_TASK標識,但還是要調用forResult方法。
注:自己不懂了,花了時間了,但是沒有想到解決方法,那就去問前輩,問別人。或許這是個坑。別人一下子就知道了為什么。
因為這個坑,沒有必要畫時間去再去平一遍。
懂得問。懂得借助他人的力量。