- 啟動模式介紹、任務棧
- 1.1 啟動模式介紹
- 1.2 任務棧
- 四種啟動模式
- 2.1 standard模式
- 2.1 singleTop模式
- 2.1 singleTask模式
- 2.1 singleInstance模式
1.1啟動模式介紹
啟動模式就是Activity的啟動策略,由AndroidManifest.xml
中activity
節(jié)點的android:launchMode="singleTask"
標簽指定。
<activity
android:name=".Activity"
android:label="@string/app_name"
android:launchMode="singleTask"
</activity>
Activity總共有四種啟動模式:
standard
、singleTop
、singleTask
、singleInstance
1.2任務棧
每個應用都有一個任務棧,是用來存放Activity
的,Activity
啟動的先后順序代表了Activity
的出現順序;比如依次啟動:Activity1
-->Activity2
-->Activity3
,則任務棧Activity
的存放順序為:
任務棧 |
---|
Activity3@1 |
Activity2@1 |
Activity1@1 |
最先啟動的Activity被放到任務棧的最底部,Activity1@1
表示Activity1
這個類序號為1
的實例,后面的Activity1@2
表示Activity1
這個類序號為2
的實例,Activity2@1
表示Activity2
這個類序號為1
的實例
2.1 standard模式
每次激活Activity
時startActivity()
,都創(chuàng)建Activity
實例,并放入任務棧。
依次啟動:Activity1
-->Activity2
-->Activity1
,則任務棧Activity
的存放順序為:
任務棧 |
---|
Activity1@2 |
Activity2@1 |
Activity1@1 |
依次啟動:Activity1
–>Activity1
–>Activity1
,則任務棧Activity
的存放順序為:
任務棧 |
---|
Activity1@3 |
Activity1@2 |
Activity1@1 |
2.2 singleTop模式
如果Activity
自己啟動自己,即任務棧棧頂就是該Activity
,此時則不需要創(chuàng)建新的實例,其余情況都要創(chuàng)建Activity
實例。
依次啟動:Activity2
–>Activity1
–>Activity1
,則任務棧Activity
的存放順序為:
任務棧 |
---|
Activity1@2 |
Activity2@1 |
依次啟動:Activity1
–>Activity2
–>Activity1
,則任務棧Activity
的存放順序為:
任務棧 |
---|
Activity1@2 |
Activity2@1 |
Activity1@1 |
2.3 singleTask模式
如果要激活的那個Activity
在任務棧中存在該實例,則不需要創(chuàng)建,只需要把此Activity
以上的OtherActivity
實例都從任務棧里面pop
出去。
依次啟動:Activity1
–>Activity2
–>Activity1
,則任務棧Activity
的存放順序為:
啟動:Activity1
–>Activity2
任務棧 |
---|
Activity2@1 |
Activity1@1 |
啟動:Activity1
–>Activity2
–>Activity1
,任務棧中已存在Activity1
的實例,則pop
出Activity1@1
上面的Activity2@1
實例
任務棧 |
---|
Activity1@1 |
SingTask的應用:
可以用來退出整個應用。
將主Activity設為SingTask模式,然后在要退出的Activity中轉到主Activity,然后重寫主Activity的onNewIntent()函數,并在函數中加上一句finish。
2.4 singleInstance模式
如果應用1
的任務棧中創(chuàng)建了Activity1
實例,如果應用2
也要激活Activity1
,則不需要創(chuàng)建,兩應用共享該Activity
實例;
應用1啟動:Activity1
–>Activity2
,應用2啟動Activity2
,則應用2不會創(chuàng)建新的實例,而是直接引用應用1中的實例Activity2@1
應用1 任務棧 | 應用2 任務棧 |
---|---|
Activity2@1 | |
Activity1@1 | Activity2@1 |
退出Activity的方法:
1.SingleTask的方法
上文已經提到,將主Activity設為SingTask模式,然后在要退出的Activity中轉到主Activity,然后重寫主Activity的onNewIntent()函數,并在函數中加上一句finish。
2.單個Activity結束
1.調用finish()
2.殺死該進程:killprocess(Process.mId)
3.終止正在運行的虛擬機:system.exit()
3.退出整個應用
1.制造拋異常導致整個程序退出
2.將所有的activity放入到一個list中,然后在需要退出的時候,將所有的activity,finish掉
3.通過廣播來完成退出功能
通過廣播來完成退出功能,具體實現過程是這樣的:在每個Activity創(chuàng)建時,在onCreate()方法中給Activity注冊一個廣播接收器,當要退出app時,發(fā)送該廣播即可
//在onCreate()方法中注冊BroadcastReceiver
IntentFilter filter = new IntentFilter();
filter.addAction("finish");
registerReceiver(mFinishReceiver, filter);
private BroadcastReceiver mFinishReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if("finish".equals(intent.getAction())) {
Log.e("tag", "finishing...");
finish();
}
}
};
把上面的代碼寫在一個基類里面,在需要退出的地方發(fā)送廣播,每個Activity接收到廣播后,就會將自己finish掉。
感謝meizixiong的文章:
http://www.cnblogs.com/meizixiong/archive/2013/07/03/3170591.html