Android中Activity啟動(dòng)模式詳解
在Android中每個(gè)界面都是一個(gè)Activity,切換界面操作其實(shí)是多個(gè)不同Activity之間的實(shí)例化操作。在Android中Activity的啟動(dòng)模式?jīng)Q定了Activity的啟動(dòng)運(yùn)行方式。
Android總Activity的啟動(dòng)模式分為四種:
Activity啟動(dòng)模式設(shè)置:
- <activity android:name=".MainActivity" android:launchMode="standard" />
Activity的四種啟動(dòng)模式:
1. standard
模式啟動(dòng)模式,每次激活A(yù)ctivity時(shí)都會(huì)創(chuàng)建Activity,并放入任務(wù)棧中。
2. singleTop
如果在任務(wù)的棧頂正好存在該Activity的實(shí)例, 就重用該實(shí)例,否者就會(huì)創(chuàng)建新的實(shí)例并放入棧頂(即使棧中已經(jīng)存在該Activity實(shí)例,只要不在棧頂,都會(huì)創(chuàng)建實(shí)例)。
3. singleTask
如果在棧中已經(jīng)有該Activity的實(shí)例,就重用該實(shí)例(會(huì)調(diào)用實(shí)例的onNewIntent())。重用時(shí),會(huì)讓該實(shí)例回到棧頂,因此在它上面的實(shí)例將會(huì)被移除棧。如果棧中不存在該實(shí)例,將會(huì)創(chuàng)建新的實(shí)例放入棧中。
4. singleInstance
在一個(gè)新棧中創(chuàng)建該Activity實(shí)例,并讓多個(gè)應(yīng)用共享改棧中的該Activity實(shí)例。一旦改模式的Activity的實(shí)例存在于某個(gè)棧中,任何應(yīng)用再激活改Activity時(shí)都會(huì)重用該棧中的實(shí)例,其效果相當(dāng)于多個(gè)應(yīng)用程序共享一個(gè)應(yīng)用,不管誰(shuí)激活該Activity都會(huì)進(jìn)入同一個(gè)應(yīng)用中。
standard
其中standard是系統(tǒng)默認(rèn)的啟動(dòng)模式。
下面通過(guò)實(shí)例來(lái)演示standard的運(yùn)行機(jī)制:
- private TextView text_show;
- private Button btn_mode;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- text_show = (TextView) this.findViewById(R.id.text_show);
- text_show.setText(this.toString());
- btn_mode = (Button) this.findViewById(R.id.btn_mode);
- }
- //按鈕單擊事件
- public void LaunchStandard(View v){
- startActivity(new Intent(this,MainActivity.class));
- text_show.setText(this.toString());
- }
初始化界面如下:
當(dāng)點(diǎn)擊按鈕時(shí),會(huì)創(chuàng)建新的Activity,通過(guò)TextView@后16進(jìn)制數(shù)的顯示即可看出,點(diǎn)擊兩次分別界面如下:
此時(shí),我們分析棧內(nèi)部的運(yùn)行機(jī)制:(依次從棧頂向上)
因此,這種Standard模式是每次都會(huì)創(chuàng)建新的Activity對(duì)象,當(dāng)點(diǎn)擊返回按鈕時(shí),他會(huì)將棧頂(當(dāng)前Activity)消滅,然后跳 到下一層,例如如果現(xiàn)在Activity是44ed8c50,那么當(dāng)我們點(diǎn)擊返回時(shí)Activity會(huì)變?yōu)?4f28a48,不過(guò)此時(shí)在這個(gè) Activity中再次點(diǎn)擊按鈕創(chuàng)建對(duì)象時(shí),它會(huì)另外創(chuàng)建新的Activity對(duì)象,這種模式可能大多數(shù)情況下不是我們需要的,因?yàn)閷?duì)系統(tǒng)性能的消耗過(guò) 大。
下面我們介紹兩種能使用當(dāng)前棧中Activity的啟動(dòng)模式:
singleTop
從上面的解釋中即可知道,在每次使用新的Activity時(shí)會(huì)自動(dòng)檢測(cè)棧頂?shù)漠?dāng)前Activity是否是需要引用的Activity,如果是則直接引用此Activity,而不會(huì)創(chuàng)建新的Activity。
我們?cè)趧偛诺慕缑嬷屑尤胍粋€(gè)"啟動(dòng)singletop模式"按鈕,當(dāng)點(diǎn)擊時(shí)出現(xiàn)我們創(chuàng)建的singletop中,在Activity singletop中有一個(gè)按鈕,啟動(dòng)singletop模式,表示啟動(dòng)當(dāng)前Activity,由于我們?cè)谇鍐挝募信渲肁ctivity的啟動(dòng)模式為 singleTop,因此此時(shí)不會(huì)再創(chuàng)建而是利用當(dāng)前棧頂?shù)膕ingleTop Activity:
- <activity
- android:name=".SingleTopActivity"
- android:label="@string/singletop"
- android:launchMode="singleTop" >
- </activity>
界面初始化:
點(diǎn)擊"啟動(dòng)singleTop模式"按鈕:
我們分析它的運(yùn)行機(jī)制,可知,當(dāng)程序運(yùn)行到此時(shí),棧中的數(shù)據(jù)形式為:
當(dāng)我們?cè)谏厦娼缑嬷悬c(diǎn)擊"啟動(dòng)singleTop模式"按鈕時(shí),由于此Activity設(shè)置的啟動(dòng)模式為singleTop,因此它首先會(huì) 檢測(cè)當(dāng)前棧頂是否為我們要請(qǐng)求的Activity對(duì)象,經(jīng)驗(yàn)證成立,因此它不會(huì)創(chuàng)建新的Activity,而是引用當(dāng)前棧頂?shù)腁ctivity。
雖然它不會(huì)創(chuàng)建新的Activity對(duì)象,不過(guò)它每次回調(diào)用onNewIntent()方法:
- @Override
- protected void onNewIntent(Intent intent) {
- // TODO Auto-generated method stub
- super.onNewIntent(intent);
- Toast.makeText(this, new Date().toString(), 1).show();
- }
我們?yōu)榇朔椒ň帉?xiě)代碼輸出當(dāng)前日期,則在每次點(diǎn)擊上面按鈕時(shí)會(huì)輸出當(dāng)前日期。
singleTask
此啟動(dòng)模式和singleTop在名字上即可看出區(qū)別,即singleTop每次只檢測(cè)當(dāng)前棧頂?shù)腁ctivity是否是我們需要請(qǐng)求創(chuàng)建的,而 singleTask則會(huì)檢測(cè)棧中全部的Activity對(duì)象,從上向下,如果檢測(cè)到是我們所請(qǐng)求的則會(huì)消滅此Activity對(duì)象上面的對(duì)象,直接把檢 測(cè)到的我們需要的Activity置為棧頂。
我們創(chuàng)建一個(gè)SingleTaskActivity,此界面中包含一個(gè)啟動(dòng)MainActivity和啟動(dòng)SingleTaskActivity按鈕。
初始化:
點(diǎn)擊"啟動(dòng)singleTask模式"按鈕:
在此界面中點(diǎn)擊第二個(gè)按鈕"啟動(dòng)singleTask模式"按鈕,根據(jù)定義會(huì)檢測(cè)當(dāng)前棧中是否有此Activity對(duì)象,因此顯示的還是當(dāng)前的Activity,不會(huì)重新創(chuàng)建;
再點(diǎn)擊"啟動(dòng)Standard模式"按鈕,由于MainActivity的啟動(dòng)模式為standard,所以在此會(huì)重新創(chuàng)建一個(gè)MainActivity對(duì)象:
此時(shí)棧中數(shù)據(jù)格式為:
當(dāng)在上面界面中點(diǎn)擊"啟動(dòng)singleTask模式"按鈕時(shí),由于檢測(cè)到當(dāng)期棧中第二個(gè)為我們要?jiǎng)?chuàng)建的Activity,會(huì)將最上面的MainActivity消滅,然后將SingleTaskActivity設(shè)置為棧頂:
SingleInstance
此啟動(dòng)模式和我們使用的瀏覽器工作原理類似,我們都知道在多個(gè)程序中訪問(wèn)瀏覽器時(shí),如果當(dāng)前瀏覽器沒(méi)有打開(kāi),則打開(kāi)瀏覽器,否則會(huì)在當(dāng)前打開(kāi)的瀏覽器中訪問(wèn)。此模式會(huì)節(jié)省大量的系統(tǒng)資源,因?yàn)樗鼙WC要請(qǐng)求的Activity對(duì)象在當(dāng)前的棧中只存在一個(gè)。
上面即為Android中的四種啟動(dòng)模式,我們?cè)陂_(kāi)發(fā)Android項(xiàng)目時(shí)會(huì)經(jīng)常使用到,巧妙設(shè)置Activity的啟動(dòng)模式會(huì)節(jié)省系統(tǒng)開(kāi)銷和程序運(yùn)行效率。