Activity的啟動模式
官網解釋鏈接
(tips:在閱讀此文章前,應先對Activity生命周期掌握)
在每一個程式的main目錄下有一個AndroidManifest.xml檔案,這個檔案是用來配置Activity的,在配置Activity時可指定android:launchMode 屬性,該屬性用于配置該Activity的啟動模式(或稱加載模式),
eg:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testapp1">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.TestApp1">
<activity android:name=".activity.MainActivity" android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".activity.NextActivity" />
<activity android:name=".activity.PersonActivity" android:launchMode="singleTop" />
</application>
</manifest>
android:launchMode 屬性支持如下4個屬性值:
- standard:標準模式,這也是默認的加載模式,
- singleTop:Task堆疊頂單列模式,
- singleTask:Task內單列模式,
- singleInstance:全域單列模式,
Activity的啟動模式負責管理實體化、啟動Activity的方式,并可以控制Activity與Task之間的加載關系,
Task可以理解為Activity堆疊,Task以堆疊的形式來管理Activity,并且先啟動的Activity被放入堆疊底,后啟動的Activity被置于堆疊頂,
standard模式以及對Activity生命周期的影響
啟動Activity時,Android都會為目標Activity創建一個新的實體,并添加在當前的Task堆疊中,特點:一直啟動新的Activity實體并且不會啟動新的Task,
MainActivity部分代碼:
findViewById(R.id.imageButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), PersonActivity.class);
view.getContext().startActivity(intent);
}
});
PersonActivity部分代碼:
findViewById(R.id.imageView2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), MainActivity.class);
view.getContext().startActivity(intent);
}
});
上面兩段代碼意思是在MainActivity中點擊id為imageButton的按鈕時,啟動PersonActivity;在PersonActivity中點擊id為imageView2的控制元件時,啟動MainActivity,
在AndroidManifest.xml中設定MainActivity和PersonActivity的啟動模式為standard:
<activity android:name=".activity.MainActivity" android:launchMode="standard" >
<activity android:name=".activity.PersonActivity" android:launchMode="standard" />
運行程式,進入MainActivity,點擊按鈕啟動PersonActivity,進入PersonActivity,點擊圖片控制元件啟動MainActivity,進入MainActivity,再次點擊按鈕啟動PersonActivity觀察其生命周期的變化:
MainActivity實體1:onCreate()->
MainActivity實體1:onStart()->
MainActivity實體1:onResume()->
此時點擊按鈕->
MainActivity實體1:onPause()->
PersonActivity()實體1:onCreate()->
PersonActivity實體1:onStart()->
PersonActivity實體1:onResume()->
MainActivity實體1:onStop()->
此時點擊圖片控制元件->
PersonActivity實體1:onPause()->
MainActivity實體2:onCreate()->
MainActivity實體2:onStart()->
MainActivity實體2:onResume()->
PersonActivity實體1:onStop()->
此時點擊按鈕->
MainActivity實體2:onPause()->
PersonActivity()實體2:onCreate()->
PersonActivity實體2:onStart()->
PersonActivity實體2:onResume()->
MainActivity實體2:onStop()

上述生命周期加粗處以及圖片標記顏色處發現:在同一個Activity對的實體未銷毀,卻進行的是onCreate()而不是onRestart(),因此,在標準模式下,Activity創建了新的物件加入Task堆疊頂,原來的實體在Task堆疊內,(不同Activity實體的hashCode值有差異,但它們所在的TaskID總是相同的,表明標準模式不會使用新的Task)
singleTop模式以及對Activity生命周期的影響
singleTop模式與standard模式類似,不同點在于singleTop模式時,若需啟動的目標Activity已經位于Task堆疊頂時,系統不會重新創建目標Activity的實體,而是復用已有位于堆疊頂Activity實體,
其對于Activity生命周期的影響與standard模式不同的時,當動的目標Activity已經位于Task堆疊頂時,不會onCreate(),而是onRestart(),其他情況與standard模式保持一致,在此不做詳細敘述,
singleTask模式以及對Activity生命周期的影響
采用singleTask這種加載模式的Activity能保證在同一個Task內只有某個Activity的一個實體,當系統采用singleTask 模式啟動目標Activity時,可分為如下三種情況:
- 如果將要啟動的目標Activity不存在,系統將會創建目標Activity的實體,并將它加入Task堆疊頂,
- 如果將要啟動的目標Activity已經位于Task堆疊頂,此時與singleTop模式的行為相同,
- 如果將要啟動的目標Activity已經存在、但沒有位于Task堆疊頂,系統將會把位于該Activity上面的所有Activity移出Task堆疊,從而使得目標Activity轉入堆疊頂,
代碼參考standard模式中貼的代碼,其中將MainActivity與PersonActivity的啟動模式設定為android:launchMode=“singleTask”
觀察在singleTask模式下對Activity生命周期的影響:
MainActivity:onCreate()->
MainActivity:onStart()->
MainActivity:onResume()->
此時點擊按鈕->
MainActivity:onPause()->
PersonActivity():onCreate()->
PersonActivity:onStart()->
PersonActivity:onResume()->
MainActivity:onStop()->
此時點擊圖片控制元件->
PersonActivity:onPause()->
MainActivity:onRestart()->
MainActivity:onStart()->
MainActivity:onResume()->
PersonActivity:onStop()->

上述生命周期加粗處以及圖片標記顏色處發現:啟動目標Activity在Task堆疊中存在時,會直接啟動已存在的Activity的實體復用,并且會銷毀Task堆疊中在此Activity實體上的Activity實體,
singleInstance模式以及對Activity生命周期的影響
在singlelInstance這種啟動(加載)模式下,系統保證無論從哪個Task中啟動目標Activity,只會創建一個目標Activity實體,并會使用一個全新的Task 堆疊來加載該Activity實體,
當系統采用 singleInstance模式啟動目標Activity時,可分為如下兩種情況,
- 如果將要啟動的目標Activity不存在,系統會先創建一個全新的Task,再創建目標Activity的實體,并將它加入新的Task堆疊頂,
- 如果將要啟動的目標Activity已經存在,無論它位于哪個應用程式中、位于哪個Task中,系統都會把該Activity所在的Task轉到前臺,從而使該Activity顯示出來,
需要指出的是,采用singleInstance模式加載Activity總是位于Task 堆疊頂,且采用singleInstance模式加載的Activity所在Task將只包含該Activity,
觀察在singleInstance模式下對Activity生命周期的影響:

從圖中可以看出,singleInstance模式下,啟動MainActivity時,創建了Task,并將MainActivity的實體放入Task堆疊中(只有一個故位于堆疊頂);啟動PersonActivity時,創建了新的Task,并將PersonActivity的實體放入新Task中(只有一個故位于堆疊頂),新Task位于前臺,原Task置于后臺;再啟動MainActivity時,由于其之前已經存在,將其位于的原Task轉入前臺,因在堆疊頂,直接展示,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/274089.html
標籤:其他
下一篇:Android接入高德地圖SDK時報錯JNI DETECTED ERROR IN APPLICATION: fid == null
