Android Activity 的四種啟動模式 lunchMode 和 Intent.setFlags();singleTask的兩種啟動方式。

來源:互聯網
上載者:User

標籤:des   android   style   http   ar   os   sp   java   檔案   

Android Activity 的四種啟動模式 lunchMode 和 Intent.setFlags();

一.Android Activity 四種啟動模式 lunchMode 在Manifest 設定檔中的屬性如下:

(1) android:launchMode="standard"

(2)android:launchMode="singleTop"

(3)android:launchMode="singleTask"

(4)android:launchMode="singleInstance"

 

二.說明:

 

Android 中Activity 生命週期 跟Task 的關係,就是進棧出棧。

很多時候我們在Manifest的Activiy 配置資訊中沒有看到lunchMode 屬性,其實沒有配置這個屬性就是系統預設屬性 android:launchMode="standard"。同一個工程AppA在這種模式下有AfirstActivity 啟動 AsecondActivity,啟動代碼是:

 
12345                 Intent intent = new Intent();                 intent.setClass(this, AsecondActivity.class);                 startActivity(intent);

Log 列印如下:

 

 

兩個TaskId 都是98.說明兩個 activity 是在同一個 任務棧 Task 中。

 

接下來我們讓這兩個Activity 不在同一個Task 中。有兩種方法實現:

(1)不修改啟動代碼,只修改 Mnaifest 中 給AsecondActivity 配置多添加 兩行代碼如下:

 

 
12 android:launchMode="singleTask"android:taskAffinity="com.xjp"


(2)修改啟動代碼:

 
12345678 Intent intent = new Intent();        // ComponentName name = new        // ComponentName("com.example.appa","com.example.appa.AsecondActivity");        // intent.setComponent(name);        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        intent.setClass(this, AsecondActivity.class);                 startActivity(intent);


多添加了一行

 
1 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

在修改 Mnaifest 中AsecondActivity 配置多添加一行

 
1 android:taskAffinity="com.xjp"

 

看Log列印:

AfirstActivity taskId = 8 而 AsecondActivity TaskId = 9.所以兩個 activity 不是在同一個任務棧 Task 中。雖然兩個activity 是在同一個工程下面。

 

分析:

由此看出,代碼裡設定

 
1 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

和設定檔中設定

 
1 android:launchMode="singleTask"

的效果是一樣的。 但是請注意,這裡要兩個條件滿足才 會讓兩個activity 不在同一個Task 中。必須 加上 屬性

 
1 android:taskAffinity="com.xjp"

有些人會奇怪,一般Manifest 設定檔中 很少看見 這個屬性,這個屬性的意思 是 “task 空間”=== “任務空間” 是的,當你沒有設定的時候也是系統預設給設定 成為 當前應用的包名。我們這裡設定 的和包名不一樣。所以兩個activity 的任務空間是不一樣的,所以兩個 activity 不在同一個 Task 中。 當然了,只是設定了

 
1 android:taskAffinity="com.xjp"

沒有設定

 
1 android:launchMode="singleTask"

或者

 
1 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

兩個 activity 也是在同一個任務空間的。親測。

 

 

總結:當設定了

 
1 android:launchMode="singleTask"

時,系統會尋找 對應的

 
1 taskAffinity

任務空間是否 有啟動過 這個activity ,如果沒有啟動,則在這個taskAffinity 任務空間啟動,如果有啟動過,則 將 這個activity 推送到棧頂, 那麼在這個activity 之上的activity 都被推送出棧了,不在任務Task 中,也就是 Ondestroy 了。

 

 

三.當 設定檔中設定了 android:launchMode="singleInstance"。不管 activity 怎麼啟動,都是在一個新的Task 任務中啟動activity。

看Log 列印:

兩個TaskId 不一樣。並且 被啟動的activity 唯一存在 新的任務隊列中,也就是這個task 隊列中只能有 一個activity。

Android Activity 的四種啟動模式 lunchMode 和 Intent.setFlags();singleTask的兩種啟動方式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.