編輯:關於android開發
一、引言
我們在多次啟動同一個Activity時,系統默認會重復創建多個實例,這樣看上去便十分的愚蠢,所以android在設計時提供了啟動模式來修改系統的默認行為。目前有四種啟動模式:standard、singleTop、singleTask和singleInstance。
二、如何設置啟動模式
1.我們可以通過AndroidMenifest為Activity指定啟動模式
<activity android:name=".SecondActivity"
android:configChanges="screenLayout"
android:launchMode="singleTask"
>
</activity>
2.我們可以通過Intent標志位來為Activity指定啟動模式 Intent intent = new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//android標志位
startActivity(intent);
三、啟動模式介紹
在學習時看到一篇不錯的博客,圖畫的很清晰明白,在這裡就不重復了。附上鏈接 http://www.cnblogs.com/meizixiong/archive/2013/07/03/3170591.html
1.stardand(系統默認):
在這裡我們先將任務棧,直接看成一個棧,來簡單了解,不做具體分析。
當我們使用stardand時,每啟動一次activity,他就會在啟動他的activity所在的棧中創建實例。
當我們用ApplicationContext去啟動他時系統會報錯。這句話我看書的時候不是特別明白,什麼是非activity的context,所以 去查了下資料,service、application和activity都是context的子類,看到這裡就明白了,context不只是單指activity。所以接下來的話便好理解了,因為非activity的context沒有任務棧,所以一但有他們去啟動一個stardand模式的activity,便會因為沒有任務棧,使得程序報錯。
解決方法,我們可以想到既然他缺少一個存放他的任務棧,那麼我們便為他創建一個。指定FLAG_ACTIVITY_NEW_TASK標記位。但如此處理他的啟動方式便成為了singleTask.
2.singleTop(棧頂復用):
當我們所要啟動的activity已經位於棧頂的時候,那麼activity不會被重建,同時他的onNewIntent方法會被回調,這裡又有疑問了,什麼是onNewIntent方法。查資料後發現,在singleTop模式中,系統並不會調用我們通常處理數據的onCreat()方法,而是調用另一個方法onNewIntent(),所以說我們為什麼要調用onNewIntent()而不時onCreat()方法呢?找了好多博客,發現這個
鏈接:http://blog.sina.com.cn/s/blog_74cb7ee101017njt.html 我看了半天,應該是調用onCreat()方法時便會創建一個activity的實例吧(可能我的理解有問題,若是您發現的話請指出,謝謝)。
附一個書上的例子
D(singleTop) ABCD---啟動D--->ABCD
D(stardand) ABCD---啟動D--->ABCDD
3.singleTask(棧內復用模式):
單實例模式,只要activity在一個棧中存在,那麼多次啟動他均不會創建實例,回調onNewIntent方法。
舉例:當啟動A時,系統會先找是否存在A所需要的棧(這裡的所需要涉及到了一個參數:TaskAffinity,這個參數指定了activity所需要的任務棧,默認為應用的包名),若不存在則新建一個棧,創建A的實例,並放入棧中。若存在,則看其中是否存在A的實例,不存在則創建並壓入棧中,若存在,則調到棧頂,回調onNewIntent()方法。
D(singleTask) 需要S2
1.S1 ABC--> S1 ABC --->S1 ABC
S2 S2 D
2. S1 ABC--->S1 ABCD
3. S1 ADBC-->S1 ADB--->S1 AD
4.singleInstance(單實例模式)
加強型singleTask模式,具有此種模式的activity啟動時,系統會單獨建立一個任務棧來存放他。如果應用1的任務棧中創建了MainActivity實例,如果應用2也要激活MainActivity,則不需要創建,兩應用共享該Activity實例
D(singleInstance)
1.S1 ABC--啟動D->S1 ABC
S2 D
除非S2被銷毀,那麼啟動D時,一直不需要重新創建。
到目前為止,啟動模式已經全部介紹完了,以上是我的全部學習體會,如果有什麼不對的,或是寫的不好的地方,請指正,謝謝。PS.(第一次寫博,有點虛)
android:eclipse看著很舒服的字體和啟動速度很快android模擬器 下載後 在c盤windows/font文件夾下添加解壓後的字體即可 然後重啟ecli
FFmpeg使用手冊 - FFmpeg 的基本組成1 FFmpeg 的基本組成FFmpeg 的基本組成包含Format、Codec、Filter、Devices、Util
我的Android進階之旅------)Java文件大小轉換工具類 (B,KB,MB,GB,TB,PB之間的大小轉換) Java文件大小轉換工具類 (B,KB,MB,
Android合並兩個APP的具體做法(掌握) 有時候因公司需求,要求合並兩個APP 使用裡面的功能。 平台:Studio 小白鼠:二維碼掃描 和自己項目