0%

Android Activity启动流程

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
2
3
4
5
6
7
8
private class ApplicationThread extends ApplicationThreadNative {
//...
schedulePauseActivity()
scheduleStopActivity()
scheduleResumeActivity()
scheduleSendResult()
scheduleLaunchActivity()
}

可以看出来它继承了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()

一言以蔽之:

  1. 旧页面的onPause调用过后,才会调用新页面的onCreate
  2. 要进入的页面的onResume调用后,才会调用之前页面的onStop

什么情况下Activity会重建?

用户期望 Activity 的界面状态在整个配置变更(例如旋转或切换到多窗口模式)期间保持不变。但是,默认情况下,系统会在发生此类配置更改时销毁 Activity,从而清除存储在 Activity 实例中的任何界面状态。同样,如果用户暂时从您的应用切换到其他应用,并在稍后返回您的应用,他们也希望界面状态保持不变。但是,当用户离开应用且您的 Activity 停止时,系统可能会销毁该应用的进程。

Activity重建的时候怎么保存和恢复参数?

  1. onSaveInstance、onRestoreInstance方法,把对象序列化传递到Bundle对象中
  2. 单例存储。
  3. 数据持久化,重建后再读取。