目錄
- 介紹
- 一、standard模式
- 二、singleTop模式
- 三、 singleTask模式
- 四、singleInstance模式
介紹
Activity的啟動模式一共有四種,分別為standard、singleTop、 singleTask、 singleInstance,可以在AndroidManifest.xml中通過給標簽指定 android:launchMode屬性來選擇啟動模式,
一、standard模式
standard模式是Activity的默認啟動模式,當我們沒有指定特定的模式啟動Activity時,Activity將會以standard模式啟動,
使用standard啟動Activity每次啟動都會創建一個Activity實體
/*在MainActivity中啟動MainActivity
每次點擊button_1就會創建一個MainActivity實體
因此需要多點擊一次button_2來關閉Activity
*/
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//列印日志查看是否創建新得MainActivity實體
Log.d("MainActivity",this.toString())
setContentView(R.layout.activity_main)
button_1.setOnClickListener {
val intent = Intent(this,MainActivity::class.java)
startActivity(intent)
}
button_2.setOnClickListener {
finish() //銷毀當前Activity
}
}
}
單擊三次創建了三個心得MainActivity實體

二、singleTop模式
當目前MainActivity已經在堆疊頂時則不會創建新的MainActivity實體,但是當MainActivity不再堆疊頂時則會繼續創建一個新的MainActivity實體
修改AndroidManifest.xml中的MainActivity的啟動模式
</activity>
<activity android:name=".MainActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
當MainActivity在堆疊頂時,運行程式
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//列印日志查看是否創建新得MainActivity實體
Log.d("MainActivity",this.toString())
setContentView(R.layout.activity_main)
button_1.setOnClickListener {
val intent = Intent(this,MainActivity::class.java)
startActivity(intent)
}
button_2.setOnClickListener {
finish() //銷毀當前Activity
}
}
}
無論點擊多少次button_1都不會創建心得MainActivity實體

當MainActivity不在堆疊頂時,運行程式
點擊button_2從MainActivity跳轉到Main2Activity,使Main2Activity在堆疊頂
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//列印日志
Log.d("data",this.toString())
setContentView(R.layout.activity_main)
//啟動Main2Activity
button_2.setOnClickListener {
val intent = Intent(this,Main2Activity::class.java)
startActivity(intent)
}
}
}
點擊button_3從Main2Activity跳轉到MainActivity
class Main2Activity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("data",this.toString())
setContentView(R.layout.activity_main2)
button_3.setOnClickListener {
val intent = Intent(this,Main2Activity::class.java)
startActivity(intent)
}
}
}
查看列印日志可以看到從Main2Activity跳轉到MainActivity時創建了一個新的MainActivity實體

三、 singleTask模式
singleTask模式則是standard模式和singleTop模式的升級版,解決了重復創建堆疊頂Activity的問題,當啟動模式設定成 singleTask模式時,每次啟動Activity,系統會先在回傳堆疊中檢查是否已經有這個實體,如果有則直接使用該實體,并且把該Activity之上的所有Activity出堆疊,如果沒有則會創建新的實體,
四、singleInstance模式
指定singleInstance模式的Activity會啟用一個新的回傳堆疊來管理這個Activity
創建三個Activity,分別為MainActivity、Main2Activity、Main3Activity
修改AndroidManifest.xml中的Main2Activity的啟動模式
<activity android:name=".Main2Activity"
android:launchMode="singleInstance"/>
<activity
修改MainActivity中的代碼taskId實際是呼叫父類getTaskId()方法
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//列印回傳堆疊ID
Log.d("data","MainActivity Task:$taskId")
setContentView(R.layout.activity_main)
//啟動Main2Activity
button_2.setOnClickListener {
val intent = Intent(this,Main2Activity::class.java)
startActivity(intent)
}
}
}
修改Main2Activity中的代碼
class Main2Activity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//列印回傳堆疊ID
Log.d("data"," Main2Activity Task:$taskId")
setContentView(R.layout.activity_main)
//啟動Main2Activity
button_3.setOnClickListener {
val intent = Intent(this,Main3Activity::class.java)
startActivity(intent)
}
}
}
修改Main3Activity中的代碼
class Main3Activity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("data","Main3Activity Task:$taskId")
setContentView(R.layout.activity_main3)
}
}
列印日志查看回傳堆疊ID

可以看到模式設定成singleInstance模式的 Main2Activity的回傳堆疊ID與模式為默認模式為standard模式的MainActivity、Main3Activity的回傳堆疊ID不同,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/226262.html
標籤:其他
下一篇:Android組件化開發簡單示例
