目录
7、Activity 的启动模式
(1)Standard
默认启动模式,系统不在乎这个Activity是否已经在返回栈中存在,每次启动都会创建一个新的Activity实例。
class FirstActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("FirstActivity",this.toString())
setContentView(R.layout.first_layout)
button1.setOnClickListener {
val intent = Intent(this,FirstActivity::class.java)
startActivity(intent)
}
}
}
重新运行程序,在 FirstActivity 的基础上启动 FirstActivity,连续点击两次按钮,可以看到 Logcat 中的打印信息如下:
可以得知,每点击一次按钮,就会创建出一个新的 FirstActivity 实例。此时返回栈中也会存在 3 个 FirstActivity 实例,因此需要连按三次 Back 键才能退出程序。
(2)singleTop
当 Activity 的启动模式指定为 singleTop,在启动 Activity 时如果发现返回栈的栈顶已经是该 Activity, 则认为可以直接使用它,不会再创建新的 Activity。
① 修改 AndroidManifest.xml 中的 FirstActivity 的启动模式;
<activity
android:name=".FirstActivity"
android:launchMode="singleTop"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
② 重新运行程序,查看 Logcat,会看的已经创建了一个 FirstActivity 的实例,如图所示:
之后不管点击多少次按钮都不会有新的打印信息出现,因为目前 FirstActivity 已经处于返回栈的栈顶,每当想要再启动一个 FirstActivity 时,都会直接使用栈顶的 Activity ,因此 FirstActivity 只会有一个实例,仅按一次 Back 键就可以退出程序。
不过当 FirstActivity 并未处于栈顶位置时,再启动 FirstActivity 还是会创建新的实例。
(3)singleTask
singleTop 模式在该 Activity 没有处于栈顶的位置时,可能会创建多个 Activity 实例。而用 singleTask 则可以让某个 Activity 在整个应用程序的上下文中只存在一个实例。
当 Activity 的启动模式指定为 singleTask ,每次启动该 Activity 时,系统首先会在这个返回栈中检查是否存在该 Activity 的实例,如果发现已经存在则直接使用该实例,并且在这个 Activity 之上的所有其他 Activity 统统出栈,如果没有发现就会创建一个新的 Activity 实例。
① 修改 AndroidManifest.xml 中的 FirstActivity 的启动模式;
android:launchMode="singleTask"
② 在 FirstActivity 中添加 onRestart( ) 方法,并打印日志
class FirstActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("FirstActivity",this.toString())
setContentView(R.layout.first_layout)
button1.setOnClickListener {
val intent = Intent(this,SecondActivity::class.java)
startActivity(intent)
}
}
override fun onDestroy() {
super.onDestroy()
Log.d("SecondActivity","onDestroy")
}
}
③ 在 SecondActivity 中添加 onDestroy( ) 方法,并打印日志
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("SecondActivity",this.toString())
setContentView(R.layout.second_layout)
button2.setOnClickListener {
val intent = Intent(this,FirstActivity::class.java)
startActivity(intent)
}
}
override fun onRestart() {
super.onRestart()
Log.d("SecondActivity","onRestart")
}
}
重新运行程序,在 FirstActivity 界面点击按钮进入 SecondActivity,然后再 SecondActivity 界面点击按钮,又会重新进入 FirstActivity(此时 SecondActivity 出栈,返回栈中只剩下一个 FirstActivity 的实例,按一下 Back 键就可以退出程序)。
(4)singleInstanse
指定为 singleInstance 模式的 Activity 会启用一个新的返回栈来管理这个 Activity(其实如果 singleTask 模式指定了不同的taskAffinity,也会启动一个新的返回栈),不管哪个应用程序来访问这个 Activity ,都共用一个返回栈,可以解决程序共享 Activity 的问题。
① 修改 AndroidManifest.xml 中的 SecondActivity 的启动模式;
android:launchMode="singleInstance"
② 修改 FirstActivity 中 onCreate( )方法的代码
调用父类的 getTaskId( ) 的方法,打印当前返回栈的id。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//Log.d("FirstActivity",this.toString())
Log.d("FirstActivity","Task id is $taskId")
setContentView(R.layout.first_layout)
button1.setOnClickListener {
val intent = Intent(this,SecondActivity::class.java)
startActivity(intent)
}
}
③ 修改 SecondActivity 中 onCreate( ) 方法的代码
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("SecondActivity","Task id is $taskId")
setContentView(R.layout.second_layout)
button2.setOnClickListener {
val intent = Intent(this,ThirdActivity::class.java)
startActivity(intent)
}
}
④ 修改 ThirdActivity 中 onCreate( ) 方法的代码
class ThirdActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("ThirdActivity","Task id is $taskId")
setContentView(R.layout.third_layout)
}
}
⑤ 重新运行程序,在 FirstActivity 界面点击按钮进入 SecondActivity,然后再 SecondActivity 界面点击按钮进入 ThirdActivity,查看 Logcat 中的打印信息
SecondActivity 是存放在一个单独的返回栈里的,而且只有 SecondActivity 一个 Activity。
按下Back 键,ThirdActivity 直接返回到 FirstActivity,再按下 Back 键,又会回到 SecondActivity ,再按 Back 键才会退出程序。
ThirdActivity 按 Back 键时从返回栈中出栈,FirstActivity就会成为栈顶,在 FirstActivity 中按下 Back 键,此时返回栈已经情空,就会显示另一个返回栈的栈顶。