Android中Activity啓動模式詳解

Android中Activity啓動模式詳解

  在Android中每個界面都是一個Activity,切換界面操作其實是多個不同Activity之間的實例化操作。在Android中Activity的啓動模式決定了Activity的啓動運行方式。
  Android總Activity的啓動模式分爲四種:
複製代碼
Activity啓動模式設置:
        <activity android:name=".MainActivity" android:launchMode="standard" />
Activity的四種啓動模式:
    1. standard
        模式啓動模式,每次激活Activity時都會創建Activity,並放入任務棧中。
    2. singleTop
        如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,否者就會創建新的實例並放入棧頂(即使棧中已經存在該Activity實例,只要不在棧頂,都會創建實例)。
    3. singleTask
        如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的onNewIntent())。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創建新的實例放入棧中。 
    4. singleInstance
        在一個新棧中創建該Activity實例,並讓多個應用共享改棧中的該Activity實例。一旦改模式的Activity的實例存在於某個棧中,任何應用再激活改Activity時都會重用該棧中的實例,其效果相當於多個應用程序共享一個應用,不管誰激活該Activity都會進入同一個應用中。
複製代碼
 
  其中standard是系統默認的啓動模式。
 
  下面通過實例來演示standard的運行機制:
複製代碼
 1 private TextView text_show;
 2     private Button btn_mode;
 3     
 4     @Override
 5     public void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.activity_main);
 8         
 9         text_show = (TextView) this.findViewById(R.id.text_show);
10         
11         text_show.setText(this.toString());
12         
13         btn_mode = (Button) this.findViewById(R.id.btn_mode);
14         
15     }
16     
    //按鈕單擊事件
17     public void LaunchStandard(View v){
18         startActivity(new Intent(this,MainActivity.class));
19         
20         text_show.setText(this.toString());
21     }
複製代碼
  初始化界面如下:
  
  當點擊按鈕時,會創建新的Activity,通過TextView@後16進制數的顯示即可看出,點擊兩次分別界面如下:
  
   
  
  此時,我們分析棧內部的運行機制:
   (依次從棧頂向上)
 
  因此,這種Standard模式是每次都會創建新的Activity對象,當點擊返回按鈕時,他會將棧頂(當前Activity)消滅,然後跳到下一層,例如如果現在Activity是44ed8c50,那麼當我們點擊返回時Activity會變爲44f28a48,不過此時在這個Activity中再次點擊按鈕創建對象時,它會另外創建新的Activity對象,這種模式可能大多數情況下不是我們需要的,因爲對系統性能的消耗過大。
  下面我們介紹兩種能使用當前棧中Activity的啓動模式:
  2. singleTop
    從上面的解釋中即可知道,在每次使用新的Activity時會自動檢測棧頂的當前Activity是否是需要引用的Activity,如果是則直接引用此Activity,而不會創建新的Activity。
    我們在剛纔的界面中加入一個"啓動singletop模式"按鈕,當點擊時出現我們創建的singletop中,在Activity singletop中有一個按鈕,啓動singletop模式,表示啓動當前Activity,由於我們在清單文件中配置Activity的啓動模式爲singleTop,因此此時不會再創建而是利用當前棧頂的singleTop Activity:
     <activity
            android:name=".SingleTopActivity"
            android:label="@string/singletop"
            android:launchMode="singleTop" >
        </activity>
 
 
    界面初始化:
      
    點擊"啓動singleTop模式"按鈕:
          
  我們分析它的運行機制,可知,當程序運行到此時,棧中的數據形式爲:
    
    當我們在上面界面中點擊"啓動singleTop模式"按鈕時,由於此Activity設置的啓動模式爲singleTop,因此它首先會檢測當前棧頂是否爲我們要請求的Activity對象,經驗證成立,因此它不會創建新的Activity,而是引用當前棧頂的Activity。
       
    雖然它不會創建新的Activity對象,不過它每次回調用onNewIntent()方法:
複製代碼
1 @Override
2     protected void onNewIntent(Intent intent) {
3         // TODO Auto-generated method stub
4         super.onNewIntent(intent);
5         
6         Toast.makeText(this, new Date().toString(), 1).show();
7     }
複製代碼
 
    我們爲此方法編寫代碼輸出當前日期,則在每次點擊上面按鈕時會輸出當前日期。
 
  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對象在當前的棧中只存在一個。
 
    
    上面即爲Android中的四種啓動模式,我們在開發Android項目時會經常使用到,巧妙設置Activity的啓動模式會節省系統開銷和程序運行效率。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章