Android开发艺术探索——学习笔记(1)

(1)Activity的生命周期和启动模式

OnRestart:标识Activity正在重新启动。一般情况下,当界面从不可见重新变为可见状态时,onRestart就会被调用。

从Activity是否可见来说,onStart和onStop是配对的。

从Activity是否在前台来说,onResume和onPause是配对的。

问题:假设当前Activity为A,如果这时用户打开一个新ActivityB,那么B的onResume和A的onPause哪个先执行呢?

答案:旧Activity先onPause,然后新Activity再启动。

源码分析:

启动Activity的请求->Instrumentation 通过Binder ->AMS

AMS内部维护着一个ActivityStack并负责栈内的Activity的状态同步。

AMS通过ActivityThread去同步Activity的状态,从而完成生命周期方法的调用。

在ActivityStack中的resumeTopActivityInnerLocked的源码中,在新Activity启动之前,栈顶的Activity需要先onPause后,新Activity才能启动。

 

异常情况下的生命周期分析:

情况1:资源相关的系统配置发生改变,导致Activity被杀死并重新创建

比如:设定了landscape或portrait状态下的图片,当Activity处于竖屏状态,如果突然旋转屏幕,系统配置就会发生改变。

Activity在异常情况下终止,系统会调用onSaveInstanceState来保存当前状态,在onStop之前调用。

当重新创建Activity时,系统会调用onRestoreInstanceState,在onStart之后。

每一个View都有上述两个方法,可重写。

保存和恢复VIew层次结构,工作流程:首先Activity被意外终止时,Activity会调用onSaveInstanceState去保存数据,然后会委托Window去保存数据,接着Window再委托它上面顶级容器(ViewGroup)去保存数据。最后顶层容器再去一一通知它的子元素来保存数据。

情况2:资源内存不足导致低优先级的Activity被杀死

前台Activity优先级最高。

系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程。

较好的方法:将后台工作放入Service中,从而保证进程有一定的优先级,这样就不会轻易地被系统杀死。

若不想系统重新创建Activity,可以给Activity指定configChanges属性:

android:configChanges=“orientation”

常用的选项有,locale(设备的本地位置发生了改变),keyboardHidden(调出了键盘)

screenSize和smallestScreenSize,比较特殊,它们的行为和编译选项有关,和运行环境无关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值