赞
踩
Activity的启动模式一共有四种,分别为standard、singleTop、 singleTask、 singleInstance,可以在AndroidManifest.xml中通过给标签指定 android:launchMode属性来选择启动模式。
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实例
当目前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模式则是standard模式和singleTop模式的升级版,解决了重复创建栈顶Activity的问题。当启动模式设置成 singleTask模式时,每次启动Activity,系统会先在返回栈中检查是否已经有这个实例,如果有则直接使用该实例,并且把该Activity之上的所有Activity出栈,如果没有则会创建新的实例。
指定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不同。
文章来源如侵删——
Activity的四种启动模式_Ternence_T的博客-CSDN博客blog.csdn.netCopyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。