Android中Activity啟動模式詳解
在Android中每個界面都是一個Activity,切換界面操作其實是多個不同Activity之間的實例化操作。在Android中Activity的啟動模式?jīng)Q定了Activity的啟動運行方式。
Android總Activity的啟動模式分為四種:
Activity啟動模式設置:
- <activity android:name=".MainActivity" android:launchMode="standard" />
Activity的四種啟動模式:
1. standard
模式啟動模式,每次激活Activity時都會創(chuàng)建Activity,并放入任務棧中。
2. singleTop
如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,否者就會創(chuàng)建新的實例并放入棧頂(即使棧中已經(jīng)存在該Activity實例,只要不在棧頂,都會創(chuàng)建實例)。
3. singleTask
如果在棧中已經(jīng)有該Activity的實例,就重用該實例(會調(diào)用實例的onNewIntent())。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創(chuàng)建新的實例放入棧中。
4. singleInstance
在一個新棧中創(chuàng)建該Activity實例,并讓多個應用共享改棧中的該Activity實例。一旦改模式的Activity的實例存在于某個棧中,任何應用再激活改Activity時都會重用該棧中的實例,其效果相當于多個應用程序共享一個應用,不管誰激活該Activity都會進入同一個應用中。
standard
其中standard是系統(tǒng)默認的啟動模式。
下面通過實例來演示standard的運行機制:
- 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());
- }
初始化界面如下:
當點擊按鈕時,會創(chuàng)建新的Activity,通過TextView@后16進制數(shù)的顯示即可看出,點擊兩次分別界面如下:
此時,我們分析棧內(nèi)部的運行機制:(依次從棧頂向上)
因此,這種Standard模式是每次都會創(chuàng)建新的Activity對象,當點擊返回按鈕時,他會將棧頂(當前Activity)消滅,然后跳 到下一層,例如如果現(xiàn)在Activity是44ed8c50,那么當我們點擊返回時Activity會變?yōu)?4f28a48,不過此時在這個 Activity中再次點擊按鈕創(chuàng)建對象時,它會另外創(chuàng)建新的Activity對象,這種模式可能大多數(shù)情況下不是我們需要的,因為對系統(tǒng)性能的消耗過 大。
下面我們介紹兩種能使用當前棧中Activity的啟動模式:
singleTop
從上面的解釋中即可知道,在每次使用新的Activity時會自動檢測棧頂?shù)漠斍癆ctivity是否是需要引用的Activity,如果是則直接引用此Activity,而不會創(chuàng)建新的Activity。
我們在剛才的界面中加入一個"啟動singletop模式"按鈕,當點擊時出現(xiàn)我們創(chuàng)建的singletop中,在Activity singletop中有一個按鈕,啟動singletop模式,表示啟動當前Activity,由于我們在清單文件中配置Activity的啟動模式為 singleTop,因此此時不會再創(chuàng)建而是利用當前棧頂?shù)膕ingleTop Activity:
- <activity
- android:name=".SingleTopActivity"
- android:label="@string/singletop"
- android:launchMode="singleTop" >
- </activity>
界面初始化:
點擊"啟動singleTop模式"按鈕:
我們分析它的運行機制,可知,當程序運行到此時,棧中的數(shù)據(jù)形式為:
當我們在上面界面中點擊"啟動singleTop模式"按鈕時,由于此Activity設置的啟動模式為singleTop,因此它首先會 檢測當前棧頂是否為我們要請求的Activity對象,經(jīng)驗證成立,因此它不會創(chuàng)建新的Activity,而是引用當前棧頂?shù)腁ctivity。
雖然它不會創(chuàng)建新的Activity對象,不過它每次回調(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)榇朔椒ň帉懘a輸出當前日期,則在每次點擊上面按鈕時會輸出當前日期。
singleTask
此啟動模式和singleTop在名字上即可看出區(qū)別,即singleTop每次只檢測當前棧頂?shù)腁ctivity是否是我們需要請求創(chuàng)建的,而 singleTask則會檢測棧中全部的Activity對象,從上向下,如果檢測到是我們所請求的則會消滅此Activity對象上面的對象,直接把檢 測到的我們需要的Activity置為棧頂。
我們創(chuàng)建一個SingleTaskActivity,此界面中包含一個啟動MainActivity和啟動SingleTaskActivity按鈕。
初始化:
點擊"啟動singleTask模式"按鈕:
在此界面中點擊第二個按鈕"啟動singleTask模式"按鈕,根據(jù)定義會檢測當前棧中是否有此Activity對象,因此顯示的還是當前的Activity,不會重新創(chuàng)建;
再點擊"啟動Standard模式"按鈕,由于MainActivity的啟動模式為standard,所以在此會重新創(chuàng)建一個MainActivity對象:
此時棧中數(shù)據(jù)格式為:
當在上面界面中點擊"啟動singleTask模式"按鈕時,由于檢測到當期棧中第二個為我們要創(chuàng)建的Activity,會將最上面的MainActivity消滅,然后將SingleTaskActivity設置為棧頂:
SingleInstance
此啟動模式和我們使用的瀏覽器工作原理類似,我們都知道在多個程序中訪問瀏覽器時,如果當前瀏覽器沒有打開,則打開瀏覽器,否則會在當前打開的瀏覽器中訪問。此模式會節(jié)省大量的系統(tǒng)資源,因為他能保證要請求的Activity對象在當前的棧中只存在一個。
上面即為Android中的四種啟動模式,我們在開發(fā)Android項目時會經(jīng)常使用到,巧妙設置Activity的啟動模式會節(jié)省系統(tǒng)開銷和程序運行效率。