美文网首页
Activity 生命周期

Activity 生命周期

作者: gczxbb | 来源:发表于2019-10-20 01:07 被阅读0次

一、基本方法和流程

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。

PauseActivityItem

ClientTransaction类的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。

ResumeActivityItem A组件恢复程序流程

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组件,让其有一定优先级。


任重而道远

相关文章

网友评论

      本文标题:Activity 生命周期

      本文链接:https://www.haomeiwen.com/subject/cecomctx.html