Activity -> LaunchMode

定義了Activity加載到Activity Task(任務棧)的行為

Activity的LaunchMode(啟動模式)有以下四種:

[假設操作的Activity對象為A_Activity]

1. Standare - Activity默認的啟動模式

Standare模式下啟動A_Activity, 系統(tǒng)都會新建一個A_Activity的實例, 并將其加入到任務棧中, 同時依次調(diào)用A_ActivityonCreate()、onStart()onResume()的生命周期方法

2. SingleTop - 棧頂復用模式

SingleTop模式下啟動A_Activity, 如果A_Activity位于任務棧的棧頂, 那么再次啟動A_Activity時, 系統(tǒng)將不會再去新建一個A_Activity實例,而是復用已位于任務棧棧頂?shù)?code>A_Activity

  • A_Activity位于棧頂:

    復用位于棧頂?shù)膶嵗? 并回調(diào)A_ActivityonNewIntent()方法

  • A_Activity不位于棧頂(包括有實例位于任務棧中但不位于棧頂在任務棧中沒有任何實例)

    此時在SingleTop的模式下啟動的A_Activity與Standard模式下啟動的A_Activity的流程是一樣的: 系統(tǒng)會新建一個A_Activity的實例, 并依次調(diào)用其對應的生命周期方法

3. SingleTask - 棧內(nèi)復用模式

該模式相當于Activity特定任務棧中的單例模式. 與SingleTop類似, 只不過是檢測范圍的不同: SingleTop的檢測范圍是檢測棧頂元素是否為A_Activity, 而SingleTask的檢測范圍則擴散到整個任務棧中去檢測是否已經(jīng)存在A_Activity實例

  • 任務棧中存在A_Activity實例

    直接將A_Activity置于棧頂,并將A_Activity以上的Activity都從任務棧中移出銷毀, 同時回調(diào)其onNewIntent()方法

  • 任務棧中不存在任何A_Activity實例

    此時在SingTask的模式下啟動的A_Activity與Standard模式下啟動的A_Activity的流程是一樣的: 系統(tǒng)會新建一個A_Activity的實例, 并依次調(diào)用其對應的生命周期方法

4. SingleInstance

這個模式非常接近于SingleTask, 系統(tǒng)中只允許一個A_Activity的實例存在. 區(qū)別在于持有A_Activity的任務棧中只能有這個一個Activity: 即這個單例本身

設置Activity的啟動模式

方式一: 直接在AndroidManifest.xml指定Activity的啟動模式

<?xml version="1.0" encoding="utf-8"?>
<manifest>

    <application>
        <activity
            android:name=".XxxActivity">
            android:launchMode="standard | singleTop | singleTask | singleInstance">
        </activity>
    </application>

</manifest>

方式二: 通過Intent添加IntentFlag(猛戳>>常用的IntentFlag的介紹)來指定Activity的啟動模式

Intent intent = new Intent();
intent.setClass(MainActivity.this,TargetActivity.class);
intent.addFlags(Intent.FLAG_XXX);
startActivity(intent);
Refer
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容