Android activity四大啓動模式詳解

Activity中四大啓動模式

在AndroidManifest.xml中 ,有一個默認的activity  在它裏面可以設置activity啓動模式,  android:launchMode="“  ,該屬性用於配置Activity的加載模式,該屬性支持4中屬性  每不同的模式出現不同的效果,下面詳解啓動模式。

standard:標準模式,默認加載模式

singleTop:Task頂單例模式
singleTask:Task內單例模式
singleInstance:全局單單例模式


1 Activity爲什麼要用指定模式??

首先介紹下Android對Activity的管理:Android採用Task來管理多個Activity,當我們啓動一個Activity時,系統就會創建一個Task,然後啓動這個Activity的入口。
Android並未給Task提供API,只能通過調用Activity的getTaskId()方法獲取它所在的Task的ID,我們可以把Task理解爲Activity 棧,Task以棧來管理Activity。


2.四大啓動模式的理解


standard加載模式

每次通過這種模式啓動Activity時,Android總會爲啓動的Activity創建一個新的實例,並將該Activity添加到當前Task棧中,這種模式不會創建新的Task,只是將新
Activity添加到原有的Task 中


singleTop模式


如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,否者就會創建新的實例並放入棧頂(即使棧中已經存在該Activity實例,只要不在棧頂,都會創建實例)。


singleTask模式


被啓動的Activity在同一個Task內只有一個Activity實例,具體分爲如下三種情況:


<1>.如果啓動的目標Activity不存在Task棧中,系統將會創建一個目標Activity實例,並將它加入到Task棧頂


<2>.如果啓動的目標Activity已存在Task棧頂,此時模式和singleTop模式相同


<3>.若果啓動的目標Activity已存在但沒有位於Task棧頂,系統將會把該目標Activity上面的所有Activity移除Task棧,使該Activity置於Task棧頂


singleInstance模式

這種加載模式下,無論從哪個Task中啓動目標Activity,只會創建一個目標Activity實例,並會使用一個全新的Task棧來裝載該Activity實例。具體可分爲兩種情況:


<1>.如果創建的目標Activity不存在,系統先會創建一個全新的Task,接着創建一個Activity實例,然後將該目標Activity加入到新的Task棧頂


<2>.如果創建的目標Activity已經存在,無論在哪個Task棧中,系統將會把Activity所在的棧置於前臺。


注意:採用singleInstance加載模式的Activity總是位於Task棧頂,並且Activity所在的Task棧只包含該Activity。



3.四大啓動模式示例


standard

其中standard是系統默認的啓動模式。

下面通過實例來演示standard的運行機制:

 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()); 

 初始化界面如下:

                              


  當點擊按鈕時,會創建新的Activity,通過TextView@後16進制數的顯示即可看出,點擊兩次分別界面如下:

                                    

                                  

                                 

 

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

                         

    因此,這種Standard模式是每次都會創建新的Activity對象,當點擊返回按鈕時,他會將棧頂(當前Activity)消滅,然後跳 到下一層,例如如果現在Activity是44ed8c50,那麼當我們點擊返回時Activity會變爲44f28a48,不過此時在這個 Activity中再次點擊按鈕創建對象時,它會另外創建新的Activity對象,這種模式可能大多數情況下不是我們需要的,因爲對系統性能的消耗過 大。


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()方法:

@Override 
     protected void onNewIntent(Intent intent) { 
        // TODO Auto-generated method stub 
        super.onNewIntent(intent); 


        Toast.makeText(this, new Date().toString(), 1).show(); 
    }

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


  singleTask


此啓動模式和singleTop在名字上即可看出區別,即singleTop每次只檢測當前棧頂的Activity是否是我們需要請求創建的,而 singleTask則會檢測棧中全部的Activity對象,從上向下,如果檢測到是我們所請求的則會消滅此Activity對象上面的對象,直接把檢 測到的我們需要的Activity置爲棧頂。

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


初始化:

                     

   當點擊”啓動singletop模式“按鈕時:

                   


           在此界面中點擊第二個按鈕”啓動singleTask模式”按鈕,根據定義會檢測當前棧中是否有此Activity對象,因此顯示的還是當前的Activity,不會重新創建;


再點擊”啓動Standard模式”按鈕,由於MainActivity的啓動模式爲standard,所以在此會重新創建一個MainActivity對象:

                       


            此時棧中的排列順序數據格式爲:


              

             當在上面界面中點擊”啓動singleTask模式”按鈕時,由於檢測到當期棧中第二個爲我們要創建的Activity,會將最上面的MainActivity消滅,然後將SingleTaskActivity設置爲棧頂

             

      

       SingleInstance


此啓動模式和我們使用的瀏覽器工作原理類似,我們都知道在多個程序中訪問瀏覽器時,如果當前瀏覽器沒有打開,則打開瀏覽器,否則會在當前打開的瀏覽器中訪問。此模式會節省大量的系統資源,因爲他能保證要請求的Activity對象在當前的棧中只存在一個。


上面即爲Android中的四種啓動模式,我們在開發Android項目時會經常使用到,巧妙設置Activity的啓動模式會節省系統開銷和程序運行效率。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章