android onActivityResult無效或先執行或無回傳問題

個人問題屬於第一種狀況,更改後下確有回傳結果。html

(http://www.cnblogs.com/tt_mc/p/3586834.html)android

Android Activity的加載模式和onActivityResult方法之間的衝突this

前言spa

今天在調試程序時,發如今某一Activity上點擊返回鍵會調用該Activity的onActivityResult()方法。我一開始用log,後來用斷點跟蹤調試半天,仍是百思不得其解。由於以前其餘的Activity的LaunchMode都是Normal,沒有特殊設定,這個Activity因爲需求改爲了singleTop。直到我肯定沒有一個地方是代碼主動觸發的,我纔想到了跟Activity的LaunchMode是否有關。調試

探索orm

在Google上搜索android activity onactivityresult singTop找到了一些問題。htm

stackoverflowblog

stackoverflow上有些人跟我遇到的問題相似。好比說有一位開發者把Activity設置成了singleTask模式,onActivityResult就收不到任何結果了。當他把singleTask模式改回標準模式,又恢復正常。ci

這個問題下面給出的答案中,有一位說startActivityForResult的文檔中有這麼一句話:開發

For example, if the activity you are launching uses the singleTask launch mode, it will not run in your task and thus you will immediately receive a cancel result.

意思是:好比說,若是你正加載的activity使用了singleTask的加載模式,它不會在你的棧中運行,並且這樣你會立刻收到一個取消的結果。

即在onActivityResult裏立刻獲得一個RESULT_CANCEL.

他還補充說沒有很好的補救方法。能夠試試用監聽廣播的方法。

另外一個stackoverflow的問題中,有人直接回答了不能再singleInstance或singleTop模式下使用startActivityForResult()方法,不只被採納了,票數還不低。

剩下的一個stackoverflow問題中,有人說把singleTask改爲singleTop就會正常,獲得高達59票並被採納。實際上我用的就是singTop,但是onActivityResult仍是平白無故被調用了。

startActivityForResult的文檔:

public void startActivityForResult (Intent intent, int requestCode, Bundle options)

Added in API level 16

Launch an activity for which you would like a result when it finished. When this activity exits, your onActivityResult() method will be called with the given requestCode. Using a negative requestCode is the same as calling startActivity(Intent) (the activity is not launched as a sub-activity).

加載一個Activity,當它結束時你會獲得結果。當這個Activty退出了,你的onActivityResult()方法會根據給出的requestCode被調用。使用一個負的requestCode和調用startActivity(intent)同樣(activity不被加載成子activity)

Note that this method should only be used with Intent protocols that are defined to return a result. In other protocols (such as ACTION_MAIN or ACTION_VIEW), you may not get the result when you expect. For example, if the activity you are launching uses the singleTask launch mode, it will not run in your task and thus you will immediately receive a cancel result.

注意這個方法只能用於被定義要返回結果的Intent協議。在其餘協議中(譬如ACTION_MAIN或ACTION_VIEW),你可能在你想獲得結果時得不到。好比,當你正載入的Activity使用的singleTask加載模式,它不會在你的棧中運行,這樣你會立馬獲得一個取消的結果。

As a special case, if you call startActivityForResult() with a requestCode >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your activity, then your window will not be displayed until a result is returned back from the started activity. This is to avoid visible flickering when redirecting to another activity.

有一個特例是,當你在初始的onCreate()方法或onResume()方法中用一個大於等於0的請求碼調用startActivityForResult(),你的窗口在被啓動的Activity返回結果前不會顯示。這是爲了不跳轉到另外一Activity時可見的閃爍。

This method throws ActivityNotFoundException if there was no Activity found to run the given Intent.

若是運行所給Intent的Activity沒被找到,該方法會拋出ActivityNotFoundException異常。

總結

後來我改變了onActivityResult裏面ResultCode爲RESULT_OK時刷新界面的具體實現方法,但是onActivityResult仍是會本身被調用,只是暫時沒觸發任何bug,可它仍是個定時炸彈啊。

之後在選擇Activity的加載模式時,要考慮onActivtyResult方法與之存在衝突。

相關文章
相關標籤/搜索