一、基本方法和流程
onCreate(),生命周期第一个方法,正在被创建,setContentView() 方法,初始化加载页面布局。
onStart(),正在启动,Activity已经活动,用户看不到,还在后台。
onRestart(),正在重新启动,用户行为导致,Home 键唤起或被新组件压后台再唤起。
onResume(),显示到前台,获得焦点,用户可见。
onPause(),正在暂停,不能耗时,否则会影响新组件的 Resume() 方法,可停止动画和存储数据。
onStop(),即将停止,且处于不可见状态,对象未销毁,做一些资源回收。
onDestory(),生命周期最后一个方法,将被销毁。
第一次启动
onCreate() == > onStart() == > onResume()
Back键退出
onPause() == > onStop() == > onDestory()
Home键后台
onPause() == > onStop()
后台唤起
onRestart() == > onStart() == > onResume()
二,两组件生命周期执行顺序(启动B压住A)
启动 B 压住 A 方法执行顺序Ams 服务首先回调 App 暂停启动者 A,然后通知启动 B,执行 B 的 onCreate()、onStart() 和 onResume() 方法,最后 Ams 服务将A停止。
日志打印在日志打印中,A暂停方法onPause()调用大概40ms(设备性能差异)后,触发B的生命周期启动方法,三个方法共耗时大概20ms,再经过大概500ms,A组件停止onStop()。
Ams服务回调ApplicationThread的scheduleTransaction()方法,基于android-28源码。
@Override
public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
ActivityThread.this.scheduleTransaction(transaction);
}
ClientTransaction是传递参数,scheduleTransaction()方法负责向主线程发送消息。
1,生命周期方法触发详细流程( A暂停 )
Ams服务传递的ClientTransaction状态请求参数PauseActivityItem。
PauseActivityItemClientTransaction类的token标志代表A组件。
A组件暂停程序流程2,生命周期方法触发详细流程( B启动 )
ClientTransaction状态LaunchActivityItem和ResumeActivityItem。
ResumeActivityItem B组件启动程序流程3,生命周期方法触发详细流程( A停止 )
Ams服务传递的ClientTransaction状态请求StopActivityItem。
StopActivityItem A组件停止程序流程三、两组件生命周期执行顺序(弹出B恢复A)
弹出B恢复A方法执行顺序Ams服务首先回调App暂停B组件,然后执行恢复A组件的方法,等待大约500ms(设备性能差异),停止B。
日志打印B暂停,ClientTransaction状态参数(PauseActivityItem)、程序流程和前图A暂停相同。
A恢复,ClientTransaction状态参数是ResumeActivityItem。
B停止+销毁,ClientTransaction状态参数是DestoryActivityItem。
DestoryActivityItem B停止+销毁程序流程四、异常流程(恢复现场)
不是用户主动决定,各种异常情况时数据存储与恢复步骤相同。
1,资源配置改变(如转屏)导致Activity重建。
2,内存不足导致Activity回收。
系统会根据当前设备加载适当Resource,如drawable,根据分辨率加载不同的图片,横屏时,从drawable-land-xxhdpi目录加载,竖屏时,从普通drawable目录加载,系统配置改变,默认重建Activity。
异常情况销毁onSaveInstanceState() 方法,保存状态,包括视图结构,文本框数据,ListView滚动位置等,在onStop()方法后调用。
正常压后台也会调用该方法。
onRestoreInstanceState() 方法,恢复状态,在 onStart() 方法后调用,异常情况重建,启动时生命周期和第一种情况相同,不同之处是数据恢复。记住一点,
AndroidManifest.xml 写入 android:configChanges=orientation|screenSize,当屏幕旋转时,Activity 组件不重建。
五、总结
onStart()和onStop()代表Activity是否活动的角度,onResume()和onPause()从用户是可见来区分触发。
onPause()和onResume()的执行顺序,从源码角度,在新组件启动前,Ams服务需要先暂停当前栈顶的组件,再开始下一个组件生命周期。
onPause()方法不能做耗时操作,否则会影响新组件启动,如果必须需要操作,尽量写在onStop()方法,它在新组件onResume()后触发。
弹出时,先暂停栈顶组件,onPause()方法,再恢复下一个组件,使其可见,最后停止并销毁弹出的组件。
异常终止时,组件会调用 onSaveInstanceState() 和 onRestoreInstanceState() 方法。
重建恢复保存的数据时,委派给窗体,窗体委派给视图,每个视图也有这两个同名方法。例如RecycleView在转屏时可保存和恢复到滚动位置,除系统自动保存的数据,用户自己的数据也需要保存和恢复,用字符串可验证。
前台活动Activity优先级最高,onStop()方法置于后台的Activity优先级最低,内存不足时,低优先级组件所在进程可能会被杀,无组件进程更容易被杀,长期的后台工作最好运行在Service组件,让其有一定优先级。
任重而道远
网友评论