Android Activity中的四種啓動模式

Android總Activity的啓動模式分爲四種:
java

<activity android:name=".MainActivity" android:launchMode="standard" />

standard】    默認模式啓動模式,每次激活Activity時都會建立Activity,並放入任務棧中。android

singleTop】    若是在任務的棧頂正好存在該Activity的實例, 就重用該實例,否者就會建立新的實例並放入棧頂(即便棧中已經存在該Activity實例,只要不在棧頂,都會建立實例)。瀏覽器

singleTask】    若是在棧中已經有該Activity的實例,就重用該實例(會調用實例的onNewIntent())。重用時,會讓該實例回到棧頂,所以在它上面的實例將會被移除棧。若是棧中不存在該實例,將會建立新的實例放入棧中。 ide

singleInstance】   在一個新棧中建立該Activity實例,並讓多個應用共享改棧中的該Activity實例。一旦改模式的Activity的實例存在於某個棧中,任何應用再激活改Activity時都會重用該棧中的實例,其效果至關於多個應用程序共享一個應用,無論誰激活該Activity都會進入同一個應用中。性能

1.standard:this

<activity android:name=".MainActivity" android:launchMode="standard" />
public class MainActivity extends ActionBarActivity {
    private Button btn;
    private TextView text_show;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
	text_show = (TextView) findViewById(R.id.text_show);
	text_show.setText(this.toString());
	btn = (Button)findViewById(R.id.btn);
	btn.setOnClickListener(new OnClickListener() {
				
	    @Override
	    public void onClick(View v) {
	        LaunchStandard(v);
	    }
	});
    }
    
    //按鈕單擊事件  
    public void LaunchStandard(View v){  
    	startActivity(new Intent(this,MainActivity.class));  
    	text_show.setText(this.toString());  
    }  
}

初始化界面以下:spa

當點擊按鈕時,會建立新的Activity,經過TextView@後16進制數的顯示便可看出,點擊兩次分別界面以下:code

此時,咱們分析棧內部的運行機制:(依次從棧頂向上)orm

所以,這種Standard模式是每次都會建立新的Activity對象,當點擊返回按鈕時,他會將棧頂(當前Activity)消滅,而後跳到下一層,例如若是如今Activity是44ed8c50,那麼當咱們點擊返回時Activity會變爲44f28a48,不過此時在這個Activity中再次點擊按鈕建立對象時,它會另外建立新的Activity對象,這種模式可能大多數狀況下不是咱們須要的,由於對系統性能的消耗過大。
對象

2.singleTop

在每次使用新的Activity時會自動檢測棧頂的當前Activity是不是須要引用的Activity,若是是則直接引用此Activity,而不會建立新的Activity。

咱們在剛纔的界面中加入一個"啓動singletop模式"按鈕,當點擊時出現咱們建立的singletop中,在Activity singletop中有一個按鈕,啓動singletop模式,表示啓動當前Activity,因爲咱們在清單文件中配置Activity的啓動模式爲singleTop,所以此時不會再建立而是利用當前棧頂的singleTopActivity:

<activity android:name=".SingleTopActivity" android:launchMode="singleTop" />

界面初始化:

點擊"啓動singleTop模式"按鈕:

咱們分析它的運行機制,可知,當程序運行到此時,棧中的數據形式爲:

當咱們在上面界面中點擊"啓動singleTop模式"按鈕時,因爲此Activity設置的啓動模式爲singleTop,所以它首先會檢測當前棧頂是否爲咱們要請求的Activity對象,經驗證成立,所以它不會建立新的Activity,而是引用當前棧頂的Activity

雖然它不會建立新的Activity對象,不過它每次回調用onNewIntent()方法:

@Override
protected void onNewIntent(Intent intent) {
    // TODO Auto-generated method stub
    super.onNewIntent(intent);
    Toast.makeText(this, new Date().toString(), 1).show();
}

咱們爲此方法編寫代碼輸出當前日期,則在每次點擊上面按鈕時會輸出當前日期。

3.singleTask

此啓動模式和singleTop在名字上便可看出區別,即singleTop每次只檢測當前棧頂的Activity是不是咱們須要請求建立的,而singleTask則會檢測棧中所有的Activity對象,從上向下,若是檢測到是咱們所請求的則會消滅此Activity對象上面的對象,直接把檢測到的咱們須要的Activity置爲棧頂。

咱們建立一個SingleTaskActivity,此界面中包含一個啓動MainActivity和啓動SingleTaskActivity按鈕。

界面初始化:

點擊"啓動singleTask模式"按鈕:

在此界面中點擊第二個按鈕"啓動singleTask模式"按鈕,根據定義會檢測當前棧中是否有此Activity對象,所以顯示的仍是當前的Activity,不會從新建立;

再點擊"啓動Standard模式"按鈕,因爲MainActivity的啓動模式爲standard,因此在此會從新建立一個MainActivity對象:

此時棧中數據格式爲:

當在上面界面中點擊"啓動singleTask模式"按鈕時,因爲檢測到當期棧中第二個爲咱們要建立的Activity,會將最上面的MainActivity消滅,而後將SingleTaskActivity設置爲棧頂

4.singleInstance

此啓動模式和咱們使用的瀏覽器工做原理相似,咱們都知道在多個程序中訪問瀏覽器時,若是當前瀏覽器沒有打開,則打開瀏覽器,不然會在當前打開的瀏覽器中訪問。此模式會節省大量的系統資源,由於他能保證要請求的Activity對象在當前的棧中只存在一個。當該模式Activity實例在任務棧中建立後,只要該實例還在任務棧中,即只要激活的是該類型的Activity,都會經過調用實例的newInstance()方法重用該Activity,此時使用的都是同一個Activity實例,它都會處於任務棧的棧頂。

相關文章
相關標籤/搜索