Activity的生命周期

1 生命周期

在这里插入图片描述

基本的生命周期

onCreate 第一个方法,初始化工作
onRestart 不可见到可见时调用
onStart 多次调用,不在前台,可见
onResume 到前台,可见
onPause 正在停止
onStop 即将停止
onDestroy 销毁

所以Activity从A跳转到B,背景不透明:
A onPause
B onCreate–onStart–onResume
A onStop
为啥会这样?很容易理解,因为如果B背景透明,A的onStop不会调用,所以具体就是这么个流程了。

深入理解activity的启动流程

跨进程启动
Launcher进程
startActivity-----Instrumentation.execStartActivity—ActivityManager.get()获取IActivityManager实例(使用单例模式)
ActivityManagerService.startActivity
解析activity的信息,处理启动参数,启动目标进程,绑定新的进程 IApplicationThread
ApplicationThread.scheduleLaunchActivity
–发送消息,然后在ActivityThread类里处理,ApplicationThread是其子类,
handleLaunchActivity(performLaunchActivity(onCreate,onStart,OnRestoreInstanceState),handleResumeActivity(onResume, makevisible))

activity是通过反射调用无参构造创建的,所以我们的activity是没有构造方法的,如果activity意外销毁重建时,也是调用无参构造,fragment也一样,所以最好不要创建有参构造了。
Instrumentation监控应用程序和系统的交互,在主进程创建的时候创建,由ActivityThread持有。

异常情况下的生命周期

onSaveInstanceState
onSaveInstanceState方法调用注意事项 :
用户主动销毁不会调用 : 当用户点击回退键 或者 调用了 finish() 方法, 不会调用该方法;
调用时机不固定 : 该方法一定是在 onStop() 方法之前调用, 但是不确定是在 onPause() 方法之前 还是 之后调用;
布局中组件状态存储 : 每个组件都实现了 onSaveInstance() 方法, 在调用函数的时候, 会自动保存组件的状态, 注意, 只有有 id 的组件才会保存;
关于默认的 super.onSaveInstanceState(outState) : 该默认的方法是实现 组件状态保存的;
onRestoreInstanceState
方法回调时机 : 在 Activity 被系统销毁之后 恢复 Activity 时被调用, 只有销毁了之后重建的时候才调用, 如果内存充足, 系统没有销毁这个 Activity, 就不需要调用;
– Bundle 对象传递 : 该方法保存的 Bundle 对象在 Activity 恢复的时候也会通过参数传递到 onCreate() 方法中;

onSaveInstanceState方法会在什么时候被执行,有这么几种情况:

1、当用户按下HOME键时
这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则

2、长按HOME键,选择运行其他的程序时。

3、按下电源按键(关闭屏幕显示)时。

4、从activity A中启动一个新的activity时。
这种情况并不一定会触发,比如设置activity为透明背景,或者调用finish方法。如果没有finish,并在这个过程没有触发save方法时,触发其余几个方法时,也会触发activity A的onSaveInstanceState方法。

5、屏幕方向切换时,例如从竖屏切换到横屏时

如果需要保存额外的数据时, 就需要覆写onSaveInstanceState()方法。大家需要注意的是:onSaveInstanceState()方法只适合保存瞬态数据, 比如UI控件的状态, 成员变量的值等,而不应该用来保存持久化数据,持久化数据应该当用户离开当前的activity时,在onPause()中保存(比如将数据保存到数据库或文件中)。说到这里,还要说一点的就是在onPause()中不适合用来保存比较费时的数据,所以这点要理解。
上面文字的引用地址

源码分析onSaveInstanceState调用

从上面的分析可以看出,在onPause和onStop都可能去调用save方法

handlePauseActivity


```java
> //saveState=r.isPreHoneycomb();   targetversion<11;
   performPauseActivity(token, finished, r.isPreHoneycomb(), "handlePauseActivity");
> activity.getApplicationInfo().targetSdkVersion
                        < android.os.Build.VERSION_CODES.HONEYCOMB;

> targetSdkVersion < 11会调用save方法,很显然一般不会调用了。
> 
> handleStopActivity
> `//saveState = true
    performStopActivityInner(r, info, show, true, "handleStopActivity");`
    在Activity不销毁的情况下,只要执行onStop,都会调用save方法

总结:
1.在activity不销毁的情况下,onSaveInstanceState本来不确定是在onPause之前还是之后调用,不过一般情况,
都是在onPause之后,因为现在的targetSdkVersion会大于11。
所以onSaveInstanceState是伴随着执行onStop消息时出现的,在调用onStop方法之前调用。
判断条件:!r.activity.mFinished && saveState, 为true才调用onSaveInstanceState方法
2.当调用了finish方法时,onSaveInstanceState就不会被调用了。
3.上面触发onSaveInstanceState方法的第四个方法,透明背景不触发。
从源码上发现,一般onSaveInstanceState在收到STOP_ACTIVITY_SHOW消息时,即走Activity的onStop方法之前才可能调用。由于透明背景,onStop不会触发,那么onSaveInstanceState也不会触发。

onSaveInstanceState中的状态数据保存在哪里?

在ActivityThread里
final ArrayMap<IBinder, ActivityClientRecord> mActivities = new ArrayMap<>();
ActivityClientRecord中的bundle

activity被kill时,不会走onDestory方法,所以保存的数据不会被清除,再次启动时会带着这些数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值