Activity的启动流程是怎样的?
为什么Activity生命周期函数是运行在UI线程的?
因为ActivityManagerService通过Binder通信给App进程的IApplicationThread这个Binder对象发送Activity生命周期的事件,而IApplicationThread是执行在Binder线程池中的,Activity生命周期函数需要执行在主线程,所以需要通过App进程的Handler转发一下,以执行在App进程的主线程。
ApplicationThread的作用是什么?
ApplicationThread是ActivityThread的内部类,继承ApplicationThreadNative,也是一个Binder对象。在此处它是作为IApplicationThread对象的server端等待client端的请求然后进行处理,最大的client就是AMS。
1 | private class ApplicationThread extends ApplicationThreadNative { |
可以看出来它继承了ApplicationThreadNative的,并且它内部有非常多的scheduleXXX的方法,这些 schedulexxx的方法会进一步的通过往外发送消息给ActivityThread的mH这个消息队列来做处理。
两个Activity相互跳转的生命周期?
A Activity跳转到B Activity
A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStop()
B Activity返回到A Activity
B.onPause() -> A.onStart() -> A.onResume() -> B.onStop() -> B.onDestroy()
一言以蔽之:
- 旧页面的onPause调用过后,才会调用新页面的onCreate
- 要进入的页面的onResume调用后,才会调用之前页面的onStop
什么情况下Activity会重建?
用户期望 Activity 的界面状态在整个配置变更(例如旋转或切换到多窗口模式)期间保持不变。但是,默认情况下,系统会在发生此类配置更改时销毁 Activity,从而清除存储在 Activity 实例中的任何界面状态。同样,如果用户暂时从您的应用切换到其他应用,并在稍后返回您的应用,他们也希望界面状态保持不变。但是,当用户离开应用且您的 Activity 停止时,系统可能会销毁该应用的进程。
Activity重建的时候怎么保存和恢复参数?
- onSaveInstance、onRestoreInstance方法,把对象序列化传递到Bundle对象中
- 单例存储。
- 数据持久化,重建后再读取。