典型情况生命周期
- onCreate() :Activity被创建
- onRestart() : 正在重新启动。调用场景:当前Activity从不可见到变为可见状态
- onStart(): Activity正在启动,此时Activity已经可见,但还不能和用户交互
- onResume():此时Activity已经可见并开始活动
- onPause()
:Activity正在停止,如果是从此Activity退到上一个Activity,那么会先执行此Activity的onPause,再执行上一个Activity的onResume,所以此方法不能执行耗时的操作,不然会影响新Activity的显示 - onStop() : Activity即将停止,紧接着onPause后面执行
- onDestroy() : Activity即将销毁,在这里主要做一些资源的释放 完整的启动流程是从上到下,有几个具体情况说明:
1)第一次启动一个新的Activity: onCreate->onStart->onResume
2)再次打开一个Activity或者切换到桌面:onPause ->onStop
(注:如果新的Activity是用的透明主题,那么不会回调onStop) 3) 再次回到此Activity:onRestar
->onStart ->onResume 4)退出此Activity (finish掉):onPause ->onStop ->onDestroty
异常情况生命周期
资源相关的系统配置发生了改变导致Activity被杀死并重新创建
发生此种情况最典型的就是横竖屏的切换,因为系统会去拿两张不同的图片,这时,Activity就会重新创建,它的onPause,onStop,onDestroy都会被调用,同时因为Activity是在异常情况下终止的,所以系统会调用onSaveInstanceState来保存当前Activity的状态,这个方法会在onStop方法之前调用。当Activity创建完成,系统会调用onRestoreInstanceState,可以从这个方法里拿到bundle对象并恢复Activity的状态
资源不足导致Activity被杀死
此种情况和第一类差不多,都可以通过以上两种方法来恢复数据
此外,我们还可以不让Activity重新创建,通过在清单文件中指定Activity的configChanges属性,通过这些属性,可以让我们在特定场景下Activity不会被重新创建,此时,如果我们进行了特殊的操作,Activity会调用onConfigurationChanged方法
Activity的启动模式
1)standard: 默认模式,每次都打开一个新的Activity,例如ABCD四个Activity,A是最底的Activity,D是当前的栈顶Activity,通过D启动D,此时栈中的Activity就会变成ABCDD
2)singleTop: 栈顶复用模式,例如ABCD四个Activity,用D启动D,栈中的Activity还是ABCD,D被复用了,并且D不会再次调用onCreate,而是会调用onNewIntent
3)singleTask: 栈内复用模式,例如ABCD,通过D启动B,栈中的Activity为:ACDB,B不会被重新创建,并且B会放入到栈顶,如果是通过D启动E,那个栈中Activcity为ABCDE,因为E在栈中没有,系统会创建一个新的实例。复用的Activity依旧会调用onNewInternt
- 单实例模式,可以理解为加强版的singTask.此种模式不但拥有singTask的全部特性,而且是单独的位于一个任务栈中,例如A是此种模式,那个系统会创建一个新的任务栈,那么由于栈的复用特性,后续的请求都不会重新创建新的Activity,除非被系统销毁了
启动模式的设置
1)通过清单文件的launchMode属性设置
2)通过Intent设置标志位来指定
Intent intent = new Intent();
intent.setClass(A.this,B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
两者的区别:第二种的优先级会高于第一种,第一种无法设置FLAG_ACTIVITY_CLEAR_TOP标识,第二种无法为Activity指定singleInstance模式。
Activity的Flags
FLAG_ACTIVITY_NEW_TASK
singleTask模式
FLAG_ACTIVITY_SINGLE_TOP
singleTop模式
FLAG_ACTIVITY_CLEAR_TOP
设置了此模式,如果是singleTask模式启动,那么就会调用onNewIntent,如果是standard模式启动,那么位于此Activity栈上的所有Activity都要出栈
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
具有这个标记的Activity不会出现在列表中,等同于xml中的excludeFromRecents=true;