Activity的四种启动模式下的生命周期(全)2019.6.11

2019.6.11下午~2019.6.12上午

文章目录

  • 四种启动模式调试
    • standard(默认)
    • singleTop(MainActivity)
      • 代码
        • 在MainActivity中
        • 在NormalActivity中
      • 运行结果
    • singleTask 栈唯一(MainActivity)
    • singleInstance(NormalActivity的启动模式为singleInstance)
  • [总结]onNewIntent何时被调用
  • 四种启动模式举例
  • intent的Flags属性
  • ==Activity相关属性taskAffinity==

四种启动模式调试

standard(默认)

Activity的四种启动模式下的生命周期(全)2019.6.11_第1张图片

1
2019-06-12 11:35:35.425 17012-17012/com.hikvision.myapplication D/MainActivity: onCreate:
D/MainActivity: com.hikvision.myapplication.MainActivity@8154688
2019-06-12 11:35:35.533 17012-17012/com.hikvision.myapplication D/MainActivity: onStart: 
2019-06-12 11:35:35.543 17012-17012/com.hikvision.myapplication D/MainActivity: onResume: 

1、应用刚启动,在启动页

2
2019-06-12 11:37:24.680 17012-17012/com.hikvision.myapplication D/MainActivity: onPause: 
2019-06-12 11:37:24.691 17012-17012/com.hikvision.myapplication D/MainActivity: onCreate:
D/MainActivity: com.hikvision.myapplication.MainActivity@8930151
2019-06-12 11:37:24.711 17012-17012/com.hikvision.myapplication D/MainActivity: onStart: 
2019-06-12 11:37:24.711 17012-17012/com.hikvision.myapplication D/MainActivity: onResume: 
2019-06-12 11:37:25.288 17012-17012/com.hikvision.myapplication D/MainActivity: onStop: 

2、Button启动MainActivity,新建了一个MainActivity实例

3
2019-06-12 11:38:55.801 17012-17012/com.hikvision.myapplication D/MainActivity: onPause: 
2019-06-12 11:38:55.816 17012-17012/com.hikvision.myapplication D/MainActivity: onCreate:
D/MainActivity: com.hikvision.myapplication.MainActivity@cd704b4
2019-06-12 11:38:55.834 17012-17012/com.hikvision.myapplication D/MainActivity: onStart: 
2019-06-12 11:38:55.835 17012-17012/com.hikvision.myapplication D/MainActivity: onResume: 
2019-06-12 11:38:56.426 17012-17012/com.hikvision.myapplication D/MainActivity: onStop: 

3、再按一次Button启动MainActivity,又新建了一个MainActivity实例

4*2
2019-06-12 11:39:43.024 17012-17012/com.hikvision.myapplication D/MainActivity: onPause: 
2019-06-12 11:39:43.030 17012-17012/com.hikvision.myapplication D/MainActivity: onRestart: 
2019-06-12 11:39:43.031 17012-17012/com.hikvision.myapplication D/MainActivity: onStart: 
2019-06-12 11:39:43.032 17012-17012/com.hikvision.myapplication D/MainActivity: onResume: 
2019-06-12 11:39:43.552 17012-17012/com.hikvision.myapplication D/MainActivity: onStop: 
2019-06-12 11:39:43.553 17012-17012/com.hikvision.myapplication D/MainActivity: onDestroy: 

4、按两back键返回,销毁第三个、第二个MainActivity,当前界面是第一个MainActivity。

5
2019-06-12 11:41:21.816 17012-17012/com.hikvision.myapplication D/MainActivity: onPause: 
2019-06-12 11:41:22.916 17012-17012/com.hikvision.myapplication D/MainActivity: onStop: 
2019-06-12 11:41:22.916 17012-17012/com.hikvision.myapplication D/MainActivity: onDestroy: 

5、再按一次back键退出程序

singleTop(MainActivity)

在AndroidManifest.xml文件中配置

<activity android:name=".MainActivity"
            android:launchMode="singleTop"
            android:label="this is MainActivity">

或在intent.addFlags(int flag)中指定

代码

在MainActivity中

打印当前活动的实例

Log.d("MainActivity", this.toString());

一个Button跳转到NormalActivity

case R.id.normal :
                Intent intent = new Intent(MainActivity.this, NormalActivity.class);
                startActivity(intent);
                break;

一个按钮跳转到MainActivity

case R.id.main :
                Intent intent2 = new Intent(MainActivity.this, MainActivity.class);
                startActivity(intent2);
                break;

在NormalActivity中

同样打印当前活动的实例

Log.d("NormalActivity", this.toString());

有个Button跳转到MainActivity

运行结果

1
2019-06-11 18:49:31.820 13212-13212/? D/MainActivity: onCreate:
D/MainActivity: com.hikvision.myapplication.MainActivity@8154688
2019-06-11 18:49:31.890 13212-13212/com.hikvision.myapplication D/MainActivity: onStart: 
2019-06-11 18:49:31.891 13212-13212/com.hikvision.myapplication D/MainActivity: onResume:	

1、应用刚启动,在启动页

2		
2019-06-11 15:41:41.666 9598-9598/com.hikvision.myapplication D/MainActivity: onPause:  
2019-06-11 18:49:42.503 13212-13212/com.hikvision.myapplication D/MainActivity: onNewIntent:
2019-06-11 15:41:41.667 9598-9598/com.hikvision.myapplication D/MainActivity: onResume: 

2、点击按钮跳转到MainActivity——没有创建新的实例:因为MainActivity已经在返回栈的栈顶
会onPause和onResume
Activity的四种启动模式下的生命周期(全)2019.6.11_第2张图片

3
D/NormalActivity: com.hikvision.myapplication.NormalActivity@6a46db6	
//NormalActivity创建并可见后,MainActivity才停止
2019-06-11 16:00:56.184 9598-9598/com.hikvision.myapplication D/NormalActivity: onCreate:
2019-06-11 16:00:56.202 9598-9598/com.hikvision.myapplication D/NormalActivity: onStart: 
2019-06-11 16:00:56.202 9598-9598/com.hikvision.myapplication D/NormalActivity: onResume: 
2019-06-11 16:00:56.823 9598-9598/com.hikvision.myapplication D/MainActivity: onStop: 

3、点击按钮跳转到NormalActivity

4 
D/MainActivity: com.hikvision.myapplication.MainActivity@9e77c31	
2019-06-11 16:03:48.037 9598-9598/com.hikvision.myapplication D/NormalActivity: onPause: 
2019-06-11 16:03:48.052 9598-9598/com.hikvision.myapplication D/MainActivity: onCreate:
2019-06-11 16:03:48.074 9598-9598/com.hikvision.myapplication D/MainActivity: onStart: 
2019-06-11 16:03:48.075 9598-9598/com.hikvision.myapplication D/MainActivity: onResume: 
2019-06-11 16:03:48.583 9598-9598/com.hikvision.myapplication D/NormalActivity: onStop: 

4、点击按钮跳转到MainActivity
此时栈顶活动是NormalActivity,因此创建一个新的MainActivity实例。
Activity的四种启动模式下的生命周期(全)2019.6.11_第3张图片

5
2019-06-11 16:09:18.125 9598-9598/com.hikvision.myapplication D/MainActivity: onPause: 
2019-06-11 16:09:18.130 9598-9598/com.hikvision.myapplication D/NormalActivity: onRestart: 
2019-06-11 16:09:18.131 9598-9598/com.hikvision.myapplication D/NormalActivity: onStart: 
2019-06-11 16:09:18.131 9598-9598/com.hikvision.myapplication D/NormalActivity: onResume: 
2019-06-11 16:09:18.688 9598-9598/com.hikvision.myapplication D/MainActivity: onStop: 
2019-06-11 16:09:18.689 9598-9598/com.hikvision.myapplication D/MainActivity: onDestroy: 

现在按back键返回NormalActivity,第二个MainActivity实例销毁

6
2019-06-11 16:10:56.258 9598-9598/com.hikvision.myapplication D/NormalActivity: onPause: 
2019-06-11 16:10:56.261 9598-9598/com.hikvision.myapplication D/MainActivity: onRestart: 
2019-06-11 16:10:56.262 9598-9598/com.hikvision.myapplication D/MainActivity: onStart: 
2019-06-11 16:10:56.262 9598-9598/com.hikvision.myapplication D/MainActivity: onResume: 
2019-06-11 16:10:56.789 9598-9598/com.hikvision.myapplication D/NormalActivity: onStop: 
2019-06-11 16:10:56.790 9598-9598/com.hikvision.myapplication D/NormalActivity: onDestroy: 

再按下back键返回MainActivity,NormalActivity实例销毁

7
2019-06-11 16:12:13.690 9598-9598/com.hikvision.myapplication D/MainActivity: onPause: 
2019-06-11 16:12:14.510 9598-9598/com.hikvision.myapplication D/MainActivity: onStop: 
2019-06-11 16:12:14.513 9598-9598/com.hikvision.myapplication D/MainActivity: onDestroy: 

再按一次才会退出程序,MainActivity销毁。

singleTask 栈唯一(MainActivity)

每次启动活动时系统首先在返回栈中检查是否存在该活动的实例,如果发现,则直接使用该实例,并把在这个活动上的所有活动通通出栈,如果没有发现,创建一个新的活动实例。
Activity的四种启动模式下的生命周期(全)2019.6.11_第4张图片

1
2019-06-11 17:04:36.306 10901-10901/? D/MainActivity: onCreate:
D/MainActivity: com.hikvision.myapplication.MainActivity@8154688
2019-06-11 17:04:36.383 10901-10901/? D/MainActivity: onStart: 
2019-06-11 17:04:36.384 10901-10901/? D/MainActivity: onResume: 

1、应用刚启动,在启动页

2
2019-06-11 18:37:42.048 13213-13213/com.hikvision.myapplication D/MainActivity: onPause: 
2019-06-11 18:37:42.048 13213-13213/com.hikvision.myapplication D/MainActivity: onNewIntent:
2019-06-11 18:37:42.049 13213-13213/com.hikvision.myapplication D/MainActivity: onResume: 

2、点击按钮跳转到MainActivity——没有创建新的实例:activity位于栈顶 时被再次start就会进入onNewIntent

3
2019-06-11 17:07:44.585 10901-10901/com.hikvision.myapplication D/MainActivity: onPause:
2019-06-11 17:07:44.596 10901-10901/com.hikvision.myapplication D/NormalActivity: onCreate:
D/NormalActivity: com.hikvision.myapplication.NormalActivity@329eb53
2019-06-11 17:07:44.612 10901-10901/com.hikvision.myapplication D/NormalActivity: onStart: 
2019-06-11 17:07:44.613 10901-10901/com.hikvision.myapplication D/NormalActivity: onResume: 
2019-06-11 17:07:45.253 10901-10901/com.hikvision.myapplication D/MainActivity: onStop: 

3、跳转到NormalActivity,新建实例,MainActivity不可见,调用onStop

4
2019-06-11 17:11:54.727 10901-10901/com.hikvision.myapplication D/NormalActivity: onPause: 
2019-06-11 17:11:54.744 10901-10901/com.hikvision.myapplication D/MainActivity: onRestart: 
2019-06-11 17:11:54.744 10901-10901/com.hikvision.myapplication D/MainActivity: onStart:
2019-06-11 18:36:58.007 13213-13213/com.hikvision.myapplication D/MainActivity: onNewIntent:  
2019-06-11 17:11:54.744 10901-10901/com.hikvision.myapplication D/MainActivity: onResume: 
2019-06-11 17:11:55.300 10901-10901/com.hikvision.myapplication D/NormalActivity: onStop: 
2019-06-11 17:11:55.300 10901-10901/com.hikvision.myapplication D/NormalActivity: onDestroy: 

4、在NormalActivity中启动MainActivity时,发现返回栈中已存在一个MainActivity的实例,并且在NormalActivity下面,于是NormalActivity从返回栈中出栈销毁,MainActivity重新成为了栈顶活动。按一下back键退出程序。
疑问?onNewIntent时机不对

singleInstance(NormalActivity的启动模式为singleInstance)

Activity的四种启动模式下的生命周期(全)2019.6.11_第5张图片

1
2019-06-11 19:52:46.652 14455-14455/com.hikvision.myapplication D/MainActivity: onCreate:
2019-06-11 19:52:46.653 14455-14455/com.hikvision.myapplication D/MainActivity: Task id is 29
2019-06-11 19:52:46.806 14455-14455/com.hikvision.myapplication D/MainActivity: onStart: 
2019-06-11 19:52:46.810 14455-14455/com.hikvision.myapplication D/MainActivity: onResume: 

1、启动页

2
2019-06-11 19:52:58.578 14455-14455/com.hikvision.myapplication D/MainActivity: onPause: 
2019-06-11 19:52:58.706 14455-14455/com.hikvision.myapplication D/NormalActivity: onCreate:
2019-06-11 19:52:58.710 14455-14455/com.hikvision.myapplication D/NormalActivity: Task id is 30
2019-06-11 19:52:58.728 14455-14455/com.hikvision.myapplication D/NormalActivity: onStart: 
2019-06-11 19:52:58.729 14455-14455/com.hikvision.myapplication D/NormalActivity: onResume: 
2019-06-11 19:52:59.302 14455-14455/com.hikvision.myapplication D/MainActivity: onStop: 

2、指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动(为了能够被其他的程序调用,共享活动实例)
NormalActivity存放在一个单独的返回栈里,这个栈中只有这一个活动

3
2019-06-11 19:53:19.129 14455-14455/com.hikvision.myapplication D/NormalActivity: onPause:
2019-06-11 19:53:19.148 14455-14455/com.hikvision.myapplication D/ThirdActivity: Task id is 29
2019-06-11 19:53:19.940 14455-14455/com.hikvision.myapplication D/NormalActivity: onStop: 

3、button跳转到ThirdActivity

4
2019-06-11 19:56:16.696 14455-14455/com.hikvision.myapplication D/MainActivity: onRestart: 
2019-06-11 19:56:16.700 14455-14455/com.hikvision.myapplication D/MainActivity: onStart: 
2019-06-11 19:56:16.701 14455-14455/com.hikvision.myapplication D/MainActivity: onResume: 

4、按back键返回,直接从ThirdActivity返回到了MainActivity:MainActivity和ThirdActivity都在29返回栈,按back键,ThirdActivity从返回栈中出栈,则MainActivity变成栈顶活动显示在界面上。

5
2019-06-11 20:00:55.990 14455-14455/com.hikvision.myapplication D/MainActivity: onPause: 
2019-06-11 20:00:56.000 14455-14455/com.hikvision.myapplication D/NormalActivity: onRestart: 
2019-06-11 20:00:56.000 14455-14455/com.hikvision.myapplication D/NormalActivity: onStart: 
2019-06-11 20:00:56.001 14455-14455/com.hikvision.myapplication D/NormalActivity: onResume: 
2019-06-11 20:00:56.748 14455-14455/com.hikvision.myapplication D/MainActivity: onStop: 
2019-06-11 20:00:56.748 14455-14455/com.hikvision.myapplication D/MainActivity: onDestroy: 

5、按back键返回,由于29返回栈已经空了,于是显示另一个返回栈30的栈顶活动,即NormalActivity。最后再按下back键,此时所有返回栈都已经空了,退出程序。

[总结]onNewIntent何时被调用

onNewIntent作用

当Activity(假设为A)的launchMode为singleTop且A的实例处于栈顶,或者launchMode为singleTask且A的实例已经在栈里(无论是栈顶还是栈中),再次启动Activity A时,便不会调用onCreate()去产生新的实例,而是调用onNewIntent()并重用返回栈里的A实例

总结

如果A在栈顶,那么方法回调的调用顺序依次为A.onPause() -> A.onNewIntent() -> A.onResume()。A的launchMode可以为singleTop或者是singleTask
如果A不在栈顶,此时它处于A.onStop()状态,当再次启动时,调用顺序依次是A.onStop() -> A.onNewIntent() -> A.onRestart() -> A.onStart() -> A.onResume()。A的launchMode只能是singleTask

作者:咸鱼壹号
来源:CSDN
原文:https://blog.csdn.net/weixin_38196407/article/details/88351030
版权声明:本文为博主原创文章,转载请附上博文链接!**


onNewIntent
第一种情况:activity launchMode为singleTask或者singleInstance
1、activityA start activityB
2、activityB start activityA
在第二步被执行后,activityA就会顺序执行 onNewIntent onRestart onStart onResume
第二种情况:activity launchMode为singleTop singleTask singleInstance
1、start activityA
2、activityA start activityA
在第二步被执行后,activityA就会顺序执行onPause onNewIntent onResume

疑问? 我实际执行出来的顺序:
在第二步被执行后,activityA就会顺序执行 onRestart onStart onNewIntent onResume

第一种情况其实是真正的activity被restart,第二种情况是activity位于栈顶时被再次start就会进入onNewIntent
其实理解的简单一点,无论什么模式,只有activity是同一个实例的情况下,intent发生了变化,就会进入onNewIntent中,这个方法的作用也是让你来对旧的intent进行保存,对新的intent进行对应的处理。
作者:OoYoO
链接:https://www.jianshu.com/p/ed381338a979
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

四种启动模式举例

standardActivity的默认加载方法,该方法会通过跳转到一个新的activity,同时将该实例压入到栈中(不管该activity是否已经存在在Task栈中,都是采用new操作)。例如: 栈中顺序是A B C D ,此时D通过Intent跳转到A,那么栈中结构就变成 A B C D A ,点击返回按钮的 显示顺序是 D C B A,依次摧毁。

singleTopsingleTop模式下,当前Activity D位于栈顶的时候,如果通过Intent跳转到它本身的Activity (即D),那么不会重新创建一个新的D实例,所以栈中的结构依旧为A B C D,如果跳转到B,那么由于B不处于栈顶,所以会新建一个B实例并压入到栈中,结构就变成了A B C D B。

singleTasksingleTask模式下,Task栈中只能有一个对应Activity的实例。例如:现在栈的结构为:A B C D。此时D通过Intent跳转到B,则栈的结构变成了:A B。其中的C和D被栈弹出销毁了,也就是说位于B之上的实例都被销毁了。

singleInstancesingleInstance模式下,会将打开的Activity压入一个新建的任务栈中。例如:Task栈1中结构为:A B C ,C通过Intent跳转到了D(D的模式为singleInstance),那么则会新建一个Task 栈2,栈1中结构依旧为A B C,栈2中结构为D,此时屏幕中显示D,之后D通过Intent跳转到D,栈2中不会压入新的D,所以2个栈中的情况没发生改变。如果D跳转到了C,那么就会根据C对应的launchMode的在栈1中进行对应的操作,C如果为standard,那么D跳转到C,栈1的结构为A B C C ,此时点击返回按钮,还是在C,栈1的结构变为A B C,而不会回到D。
--------------------- 作者:vipra
来源:CSDN
原文:https://blog.csdn.net/vipzjyno1/article/details/25463457
版权声明:本文为博主原创文章,转载请附上博文链接!

intent的Flags属性

Intent.FLAG_ACTIVITY_NEW_TASK (默认)
默认的跳转类型,它会重新创建一个新的Activity,不过与这种情况,比如说Task1中有A,B,C三个Activity,此时在C中启动D的话,如果在AndroidManifest.xml文件中给D添加了Affinity的值和Task中的不一样的话,则会在新标记的Affinity所存在的Task中压入这个Activity。如果是默认的或者指定的Affinity和Task一样的话,就和标准模式一样了启动一个新的Activity.

intent.FLAG_ACTIVITY_SINGLE_TOP
这个FLAG就相当于启动模式中的singletop,例如:原来栈中结构是A B C D,在D中启动D,栈中的情况还是A,B,C,D。

intent.FLAG_ACTIVITY_CLEAR_TOP
这个FLAG就相当于启动模式中的SingleTask,这种FLAG启动的Activity会把要启动的Activity之上的Activity全部弹出栈空间。例如:原来栈中的结构是A B C D ,从D中跳转到B,栈中的结构就变为了A B了。(这个方法可以用来关闭多个Activity,之后的一篇博文里面会提到)


作者:vipra
来源:CSDN
原文:https://blog.csdn.net/vipzjyno1/article/details/25463457
版权声明:本文为博主原创文章,转载请附上博文链接!

Activity相关属性taskAffinity

你可能感兴趣的:(Android,Android,AndroidStudio)