學習過Android開發的同學一定非常熟悉Activity,這也是四大組件中平時接觸最多的東西。關於Activity稍微深入一點就是其不同的啓動模式。即standard、singleTop、singleTask 和singleInstance。可以在AndroidManifest.xml 中通過給 標籤指定android:launchMode 屬性來選擇啓動模式。現在大部分教程及書籍中都會都其有細緻的講解。
日常開發中,通過合理的設置Activity的啓動模式可以避免一些bug的發生。比如在一個APP中,註冊頁面、登錄頁面及設置頁面所在的activity一般都會設置爲singleTask的啓動模式,正常情況下,上述頁面應該都有且只有一個Activity實例。這樣一方面可以節省內存資源,另一方面也可以有效的避免一些非常規操作帶來的問題,但是這樣也會帶來新的問題。
我們用Intent在Activity之間相互傳遞數據時,必不可少的會使用到startActivityForResult方法及與之對應的onActivityResult方法。
平時使用起來也是屢試不爽。
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent, 0);
如上面這段代碼所示。如果有一天你心血來潮的把SecondActivity的啓動模式修改爲singleTask,你會意外的發現onActivityResult居然不執行了。我們在看一下Android API 中的的註釋(截取部分內容)
/*
*When using this flag, if a task is already running for the activity
* you are now starting, then a new activity will not be started; instead,
* the current task will simply be brought to the front of the screen with
* the state it was last in. See {@link #FLAG_ACTIVITY_MULTIPLE_TASK} for a flag
* to disable this behavior.
*
* **This flag can not be used when the caller is requesting a result from
* the activity being launched.**
*/
`public static final int FLAG_ACTIVITY_NEW_TASK = 0x10000000;`
總得意思就是每次啓動該活動時系統首先會在返回棧中檢查是否存在該活動的實例,如果發現已經存在則直接使用該實例,並把在這個活動之上的所有活動統統出棧,如果沒有發現就會創建一個新的活動實例。
而且,也看到了在最後,註釋中粗體內容也說到了,如果要從所啓動的Activity中獲取返回值得時候,不能用這個標誌位。因此,onActivityResult方法不能執行也是必然的了。順便提一下,singleInstance的啓動方式也是同樣的結果。
至此,應該明白對Activity啓動模式的更改還是需要謹慎操作。