Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android進階--Acticivity的啟動模式,acticvity啟動模式

Android進階--Acticivity的啟動模式,acticvity啟動模式

編輯:關於android開發

Android進階--Acticivity的啟動模式,acticvity啟動模式


一、引言   

    我們在多次啟動同一個Activity時,系統默認會重復創建多個實例,這樣看上去便十分的愚蠢,所以android在設計時提供了啟動模式來修改系統的默認行為。目前有四種啟動模式:standard、singleTop、singleTask和singleInstance。

二、如何設置啟動模式

    1.我們可以通過AndroidMenifest為Activity指定啟動模式

    <activity android:name=".SecondActivity"
android:configChanges="screenLayout"
android:launchMode="singleTask"
>
</activity>

    2.我們可以通過Intent標志位來為Activity指定啟動模式    Intent intent = new Intent(); 
           intent.setClass(MainActivity.this,SecondActivity.class);
           intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//android標志位
           startActivity(intent);
三、啟動模式介紹

     在學習時看到一篇不錯的博客,圖畫的很清晰明白,在這裡就不重復了。附上鏈接              http://www.cnblogs.com/meizixiong/archive/2013/07/03/3170591.html

     1.stardand(系統默認):

        在這裡我們先將任務棧,直接看成一個棧,來簡單了解,不做具體分析。

        當我們使用stardand時,每啟動一次activity,他就會在啟動他的activity所在的棧中創建實例。

        當我們用ApplicationContext去啟動他時系統會報錯。這句話我看書的時候不是特別明白,什麼是非activity的context,所以 去查了下資料,service、application和activity都是context的子類,看到這裡就明白了,context不只是單指activity。所以接下來的話便好理解了,因為非activity的context沒有任務棧,所以一但有他們去啟動一個stardand模式的activity,便會因為沒有任務棧,使得程序報錯。

       解決方法,我們可以想到既然他缺少一個存放他的任務棧,那麼我們便為他創建一個。指定FLAG_ACTIVITY_NEW_TASK標記位。但如此處理他的啟動方式便成為了singleTask.

     2.singleTop(棧頂復用):

         當我們所要啟動的activity已經位於棧頂的時候,那麼activity不會被重建,同時他的onNewIntent方法會被回調,這裡又有疑問了,什麼是onNewIntent方法。查資料後發現,在singleTop模式中,系統並不會調用我們通常處理數據的onCreat()方法,而是調用另一個方法onNewIntent(),所以說我們為什麼要調用onNewIntent()而不時onCreat()方法呢?找了好多博客,發現這個

鏈接:http://blog.sina.com.cn/s/blog_74cb7ee101017njt.html 我看了半天,應該是調用onCreat()方法時便會創建一個activity的實例吧(可能我的理解有問題,若是您發現的話請指出,謝謝)。

       附一個書上的例子

              D(singleTop)    ABCD---啟動D--->ABCD

              D(stardand)     ABCD---啟動D--->ABCDD

     3.singleTask(棧內復用模式):

          單實例模式,只要activity在一個棧中存在,那麼多次啟動他均不會創建實例,回調onNewIntent方法。

         舉例:當啟動A時,系統會先找是否存在A所需要的棧(這裡的所需要涉及到了一個參數:TaskAffinity,這個參數指定了activity所需要的任務棧,默認為應用的包名),若不存在則新建一個棧,創建A的實例,並放入棧中。若存在,則看其中是否存在A的實例,不存在則創建並壓入棧中,若存在,則調到棧頂,回調onNewIntent()方法。

       D(singleTask) 需要S2 

       1.S1 ABC--> S1 ABC --->S1 ABC

                           S2              S2 D

        2. S1 ABC--->S1 ABCD

        3. S1 ADBC-->S1  ADB--->S1  AD

     4.singleInstance(單實例模式)

       加強型singleTask模式,具有此種模式的activity啟動時,系統會單獨建立一個任務棧來存放他。如果應用1的任務棧中創建了MainActivity實例,如果應用2也要激活MainActivity,則不需要創建,兩應用共享該Activity實例

       D(singleInstance)

       1.S1 ABC--啟動D->S1 ABC

                                   S2 D                

       除非S2被銷毀,那麼啟動D時,一直不需要重新創建。

     

      到目前為止,啟動模式已經全部介紹完了,以上是我的全部學習體會,如果有什麼不對的,或是寫的不好的地方,請指正,謝謝。PS.(第一次寫博,有點虛)

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved