Activity的生命周期和启动模式

典型情况生命周期

  • 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

  1. 单实例模式,可以理解为加强版的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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值