Android入門:Activity四種啓動模式


一、啓動模式介紹


啓動模式簡單地說就是Activity啓動時的策略,在AndroidManifest.xml中的<Activity>標籤的android:launchMode屬性設置;
啓動模式有4種,分別爲standard、singleTop、singleTask、singleInstance;
講解啓動模式之前,有必要先講解一下“任務棧”的概念;

任務棧

每個應用都有一個任務棧,是用來存放Activity的,功能類似於函數調用的棧,先後順序代表了Activity的出現順序;比如Activity1-->Activity2-->Activity3,則任務棧爲:



啓動模式


(1)standard:每次激活Activity時(startActivity),都創建Activity實例,並放入任務棧;
(2)singleTop:如果某個Activity自己激活自己,即任務棧棧頂就是該Activity,則不需要創建,其餘情況都要創建Activity實例;

(3)singleTask:如果要激活的那個Activity在任務棧中存在該實例,則不需要創建,只需要把此Activity放入棧頂,並把該Activity以上的Activity實例都pop;

(4)singleInstance:如果應用1的任務棧中創建了MainActivity實例,如果應用2也要激活MainActivity,則不需要創建,兩應用共享該Activity實例;




二、代碼實例



1.standard


場景描述:MainActivity點擊按鈕激活自己,但是MainActivity的引用發生改變;

效果:




AndroidManifest.xml

[java] view plaincopy
  1. <activity  
  2.             android:name=".MainActivity"  
  3.             android:label="@string/app_name" android:launchMode="standard">  


MainActivity.java

[java] view plaincopy
  1. package com.xiazdong.launchmode;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. import android.widget.TextView;  
  10.   
  11. public class MainActivity extends Activity {  
  12.     private Button standardButton;  
  13.     private TextView showView;  
  14.     private OnClickListener listener = new OnClickListener(){  
  15.         @Override  
  16.         public void onClick(View v) {  
  17.             Intent intent = new Intent(MainActivity.this,MainActivity.class);  
  18.             startActivity(intent);  
  19.         }  
  20.     };  
  21.     @Override  
  22.     public void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.main);  
  25.         showView = (TextView)this.findViewById(R.id.showview);  
  26.         standardButton = (Button)this.findViewById(R.id.standard);  
  27.         standardButton.setOnClickListener(listener);  
  28.         showView.setText(this.toString());  
  29.     }  
  30. }  


2.singleTop


場景描述:MainActivity自己激活自己,但是MainActivity並沒有創建實例,即引用不變;

效果:



AndroidManifest.xml

[html] view plaincopy
  1. <activity  
  2.             android:name=".MainActivity"  
  3.             android:label="@string/app_name" android:launchMode="singleTop">  

MainActivity.java

[java] view plaincopy
  1. package com.xiazdong.launchmode;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. import android.widget.TextView;  
  10.   
  11. public class MainActivity extends Activity {  
  12.     private Button standardButton;  
  13.     private TextView showView;  
  14.     private OnClickListener listener = new OnClickListener(){  
  15.         @Override  
  16.         public void onClick(View v) {  
  17.             Intent intent = new Intent(MainActivity.this,MainActivity.class);  
  18.             startActivity(intent);  
  19.         }  
  20.     };  
  21.     @Override  
  22.     public void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.main);  
  25.         showView = (TextView)this.findViewById(R.id.showview);  
  26.         standardButton = (Button)this.findViewById(R.id.standard);  
  27.         standardButton.setOnClickListener(listener);  
  28.         showView.setText(this.toString());  
  29.     }  
  30. }  


3.singleTask


場景描述:

MainActivity的啓動模式爲singleTask,MainActivity激活OtherActivity,然後OtherActivity激活MainActivity,發現MainActivity引用不變,然後MainActivity再次激活OtherActivity,但是OtherActivity的引用變了;

效果:




AndroidManifest.xml

[html] view plaincopy
  1. <activity  
  2.            android:name=".MainActivity"  
  3.            android:label="MainActivity" android:launchMode="singleTask">  
  4.             
  5.        </activity>  
  6.        <activity   
  7.            android:name=".OtherActivity" android:launchMode="singleTask" android:label="OtherActivity"  
  8.            ></activity>  

MainActivity和OtherActivity就是簡單的代碼,略;


4.singleInstance


場景描述:App1應用和App2應用分別激活SingleInstance應用的MainActivity,發現兩個應用激活後MainActivity的引用一樣;

效果:




SingleInstance的AndroidManifest.xml

[html] view plaincopy
  1. <activity  
  2.             android:name=".MainActivity"  
  3.             android:label="@string/app_name" android:launchMode="singleInstance">  

發佈了1 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章