Activity棧管理(二):Launch Mode

android 使用了activity stack 來管理activity .其中一個task 對應了一個activity 棧

本文將從一下兩個方面來講述 activity launch mode(不考慮intent FLAG)

\1. activity 有多少中l(wèi)aunch mode
\2. luanch mode 的作用

launch mode

android 當中activity 當中有多少種launch mode?
答案是:4種.分別是 standard singleTop singleTask singleInstance

standard :

standard 是默認的啟動方式.理論上一個Activity可以有無限個實例(內存耗盡為止?).
代碼示例

//我在Manifest里面配置了兩個Activity  FirstActivity SecondActivity 默認的配置就是standard了
<activity android:name=".FirstActivity">
</activity>
<activity android:name=".SecondActivity">
</activity>
...
//在FirstActivity 里面啟動SecondActivity
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);

以上的代碼就簡要的展示了Activity的標準啟動模式.
當SecondActivity 被啟動之后,它對應的實例會被壓入相同的Task 當中.并且置于棧頂.如果按下返回鍵,SecondActivity 會出棧,從棧頂移除,onDestroy方法會被調用
下面的代碼更有意思

//在 FirstActivity 當中調用FirstActivity
Intent intent=new Intent(FirstActivity.this,FirstActivity.class);
startActivity(intent);

上面這樣做是沒有問題的.
這樣會創(chuàng)建一個新的實例,并且把新的實例壓入棧頂

在其他的應用當中使用standard 方式啟動會怎么樣?

//xml 當中配置
<activity android:name=".FirstActivity">
<intent-filter>
<action android:name="com.example.demo.LAUNCH">
<category android:name="android.intent.category.DEFAULT"/>
<intent-filter>
</activity>
....
其它應用當中啟動 activity
Intent intent=new Intent("com.example.demo.LAUNCH");
startActivity(intent)

上面的代碼簡要展示了在其他的應用當中使用隱式Intent 啟動了一個Activity
如果FirstActivity 所在的應用沒有啟動的話,系統(tǒng)會開啟一個新的進程,然后在新的Task 當中壓入FirstActivity的新實例.
如果FirstActivity 所在應用啟動了,則會在所在應用的Task當中壓入新的實例,而不是在啟動它的應用的Task 當中壓入它.

singleTop

singleTop 的意思是:如果當前的Task的頂部存在了對應的Activity 實例,就不會創(chuàng)建新的實例了,但是onNewIntent方法會被調用.

//配置signleTop
<activity android:name=".FirstActivity"
android launchMode="singTop">
</activity>

以上就完成了配置
這種模式下的啟動方法和standard一樣,就不貼代碼了(使用Intent)
它的啟動模式和standard 基本相同,在其他應用當中啟動也和standard一樣:
1.啟動源是相同應用(應用內啟動):如果Task 頂部存在對應的實例,不創(chuàng)建新的實例,調用onNewIntent方法.否則創(chuàng)建新的實例,同事壓入Task頂部.
2.啟動源是不同的應用(應用外啟動):
 2.1.如果目標所在的應用沒有啟動,開啟新進程,創(chuàng)建新Task,創(chuàng)建實例,壓入新創(chuàng)建的Task.
2.2.如果目標所在的應用已經啟動了,Task 頂部沒有目標的實例,創(chuàng)建新實例,壓入目標所在應用的Task.如果棧頂由目標實例,就直接調用onNewIntent.

singleTask

singleTask 的模式表示的是:當前的Task當中只能有一個目標Activity 的實例,如果Task 當中沒有對應的實例,則創(chuàng)建新的實例,并把該實例放置在Task頂部.如果當前的Task由對應的實例,則將目標實例上面的所有其他的Activity 出棧(相應的onDestroy方法會被調用).
簡單的示例:
有Activity A,B,C在一App 1 中,其中A的啟動模式為singleTask B 為程序入口,C 啟動模式為standard
Manifest 當中配置singleTask

<activity android:name".A"
android launchMode="singleTask">
</activity>

啟動App 1 ,App 1 當中的Task 的情況為:B
Intent intent=new Intent(B.this,A.class); B.this.startActivity(intent);
B啟動A 這個時候Task 的情況為BA
Intent intent=new Intent(A.this,C.class);A.this.startActivity(intent);
A 再通過Intent 啟動C 這個Task 的情況為BAC
C 再次啟動A(A onNewIntent 會被調用)
Intent intent=new Intent(C.this,A.class);C.this.startActivity(intent);
由于C的啟動模式為:singleTask;所以原本標準模式啟動情況下Task的情況為 BACA ,在singleTask 變成了BA
頂部的C出棧,onDestroy被調用,生命周期結束.

在另外的App 當中啟動A的情況是這樣的:

1.App1沒有啟動:開啟新的進程,創(chuàng)建新的Task ,創(chuàng)建A的實例,壓A入棧.
2.App1已經啟動:
2.1 A沒有實例:創(chuàng)建A實例,壓入棧頂.
2.2 A有實例:
2.2.1 A 在棧頂:直接啟動,調用A的onNewIntent
2.2.2 A 不在棧頂,把A上面的Activity出棧,調用A的onNewIntent

singleIntance

singleIntance 是這樣的:系統(tǒng)當中只能有一個該Activity的實例;如果當前系統(tǒng)沒有該實例,就會創(chuàng)建一個新的Task(無論是內部啟動還是外部的App 啟動),創(chuàng)建該Activity實例,將目標Activity壓入該Task中(該Task只能存放該Activity的實例).如果系統(tǒng)中存在該Activity的實例,就調用其onNewIntent 方法.
singleIntance 程序內部啟動和外部啟動都是一樣的.
簡單示例:
App 1 當中有Activity A B C ,B為入口?。羻幽J綖閟ingleInstance,C為標準啟動模式;
啟動應用:App1 當中只有一個Task(假設為t1),里面只有B
Intent intent=new Intent(B.this,A.class);B.this.startActivity(intent);
App1 當中會有另外的Task(假設為t2),里面只有A
Intent intent=new Intent(A.this,C.class);A.this.startActivity(intent)
A 啟動了C.這個時候t2 也只有A,但是t1多了C 變成:BA


錯誤之處歡迎指出!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容