講講 Android Activity 四種(standard,singletop,singleTask,singlestance )啟動模式

wjta168 8年前發布 | 29K 次閱讀 Android Activity Android開發 移動開發

今天要講得是Activity的四種啟動模式launchMode屬性,該屬性用于配置該Activity的加載模式,該屬性支持以下4個屬性值。

  • standard:標準模式,也是默認模式。
  • singletop:Task棧頂單例模式。
  • singleTask:Task內單例模式。
  • singlestance:全局單例模式。

在繼續寫下去之前我想說一下,像launchMode這種基礎的Android知識在網上已經有很多大神寫得十分詳細,為什么我還要寫呢?我之所以寫,是因為我確確實實是個菜鳥,將課本、網上大神的總結再加上自己對知識點的認知去寫出來希望讓我對這個知識點更加了解。

回到話題,今天要弄懂的是:

  1. 為什么要為Activity指定加載模式?
  2. 每個加載模式有什么不同?
  3. 在什么時候應該用哪一種模式?
  4. 怎么樣使用加載模式?

       先介紹Android對Activity的管理,Android采用Task來管理多個Activity,當我們啟動一個應用是,Android就會為其創建一個Task,然后啟動這個應用的入口Activity (即 < intent-filter…/>)中配置的MAIN和LAUNCHER)。

       可以把Task理解為任務棧,Task以棧的形式管理Activity:先入后出。通過調用Activity的getTaskId()的方法來獲取他所在Task的ID。

       launchMode在多個Activity跳轉的過程中扮演著重要的角色,它可以決定是否生成新的Activity實例,是否重用已存在的Activity實例,是否和其他Activity實例共用一個Task。

       那么Activity的加載模式就是負責管理實例化加載Activity的方式,并可以控制Activity與Task之間的加載關系

       首先我們可以在AndroidManifest.xml中配置Activity的 android:launchMode屬性:

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

接下來我們就開始認識這4種加載模式。

1.standard

每次通過這種模式啟動目標Activity時,Android總會為其目標Activity創建一個新的實例,并將其添加到當前Task棧中,所有我們發現:是在同個任務棧里面,只是創建了不同的實例。

下面示例使用standard模式不斷啟動自身:

public class MainActivity3 extends ActionBarActivity {

    private TextView tv;
    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity3);

        tv = (TextView) findViewById(R.id.tv);//定義文本
        btn = (Button) findViewById(R.id.Btn);//定義按鈕
        tv.setText(String.format("TaskId:%d\n Current Activity:%s", getTaskId(), toString()));
        btn.setOnClickListener(new View.OnClickListener() {//為按鈕添加監聽器,當單擊按鈕時啟動MainActivity3
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity3.this,MainActivity3.class));
            }
        });

    }

正如以上代碼,每次單擊按鈕都會啟動自身MainActivity3,程序無需配置Activity的launchMode屬性,因為默認是采用standard模式.
運行結果 這里寫圖片描述

顯然,當用戶單擊手機上面的”返回”鍵時,系統會“逐一”從Activity棧頂刪除Activity實例。同時也表明這種加載模式不會使用全新的Task。

——————————

2.singleTop
我們先在AndroidManifest.xml中配置Activity的 android:launchMode屬性:

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

這種模式與standard模式基本相同,但有一點是不同:當將要啟動的目標Activity已經位于Task棧頂時,系統不會重新創建目標Activity的實例。

使用的之前已修改啟動模式的實例:
這里寫圖片描述

當單擊按鈕時,并沒有什么反應。

為了更好的了解singleTop模式的作用,再創建一個Activity,MainActivity4。

現有MainActivity3、MainActivity4兩個Activity實例,功能是1.啟動自己,2.啟動另一個Activity。就好比A啟動A,A啟動B;B啟動A,B啟動B。

代碼只是多了個按鈕 以及監聽,這里就不寫出來了

這里寫圖片描述

單擊上面那個按鈕就是A啟動A,在singleTop模式中是沒有反應的,當單擊下面那個按鈕時候就相當于 A啟動B,此時我們來看看反應如何:

這里寫圖片描述

根據上圖顯示,我們以及跳轉到了MainActivity4中,也就是我所說的B中, TaskId仍然與A中的12是一樣的,但兩個MainActivity實例是不一樣的。

此時我們再單擊第一個按鈕,也就是說由B到A,

這里寫圖片描述

此時我們仔細看,MainActivity3的兩次的實例都不一樣。

就想之前所說 :當將要啟動的目標Activity已經位于Task棧頂時,系統不會重新創建目標Activity的實例。而每次啟動其他的目標Activity時,功能就像standard模式。

——————————

3.singleTask
先在AndroidManifest.xml中配置Activity的 android:launchMode屬性:

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

這個十分好理解,采用這種加載模式的Activity在同一個Task內只有一個實例,當系統采用singleTask模式啟動目標Activity時,分為三種情況:

  1. 如果將要啟動的目標Activity 不存在,系統將會創建目標Activity的實例,并加入Task任務棧頂。
  2. 如果將要啟動的目標Activity 已經位于Task棧頂,此時與singleTop模式的行為相同。
  3. 如果要啟動的Activity 已經存在、但沒有位于Task棧頂,系統會將把位于該Activity上面所有Activity移出Task,從而使其轉入棧頂 (大爺作風)。

——————————

4.singlelnstance

在AndroidManifest.xml中配置Activity的 android:launchMode屬性:

        <activity  android:name=".MainActivity3" android:launchMode="singlelnstance">
        </activity>

在這種加載模式下,系統保證無論從哪個Task中啟動目標Activity,只會創建一個目標Activity實例,并會使用一個全新的Task棧來加載該Activity實例。

  1. 如果將要啟動的目標Activity 不存在,系統會先創建一個全新的Task棧,再創建目標Activity實例,并將它假如新的Task棧頂。
  2. 如果將要啟動的目標Activity 已經存在,無論它位于哪個應用程序中、位于哪個Task中,系統都會把該Activity所在的Task轉到前臺,從而使該Activity顯示出來。

——————————

合抱之木,生於毫末;九層之臺,起於累土;千里之行,始於足下。《老子》

作為一個程序員,樹立遠大的目標是值得欣賞的,但不能只去空想,要一步一步地實踐才行。成大事者,須從小事做起;萬事起于忽微,量變引起質變。 —— by @liuhe688

以下是參考的博客:
- http://blog.csdn.net/liuhe688/article/details/6754323
- http://www.cnblogs.com/lwbqqyumidi/p/3771542.html
以下是參考的書籍:
- 《瘋狂的Android講義》電子工業出版社

來自: http://blog.csdn.net/qq_26849491/article/details/51241356

 

 本文由用戶 wjta168 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!