当屏幕从竖屏切换到横屏的时候,Activity重建了;这个重建的过程发生了啥?
0)竖屏转横屏,PhoneWindowManager中有一个监听器监听Sensor来的通知,然后就是下面的调用逻辑了。
1)PhoneWindowManager::updateRotation
2)WindowManagerService::updateRotation
::updateRotationUnchecked
3) DisplayContent::sendNewConfiguration
4)WindowManagerService.mH::SEND_NEW_CONFIGURATION
5) WindowManagerService::sendNewConfiguration
ActivityTaskManagerService::updateDisplayOverrideConfiguration
::updateDisplayOverrideConfigurationLocked
::ensureConfigAndVisibilityAfterUpdate
6)ActivityRecord::ensureActivityConfiguration
::relaunchActivityLocked (relaunch & lifeitem)
7)ActivityRelaunchItem::handleRelaunchActivity()
8)ActivityThread::handleRelaunchActivity()
::handleConfigurationChanged
::handleRelaunchActivityInner
::performPauseActivity{
1::callActivityOnSaveInstanceState()->Instrumentation::callActivityOnSaveInstanceState->Activity::callActivityOnSaveInstanceState
2::performPauseActivityIfNeeded->Instrumentation::callActivityOnPause->activity::performPause()
}
::callActivityOnStop->r.activity.performStop
::handleDestroyActivity->performDestroyActivity{
1::activity::retainNonConfigurationInstances()
2::Instrumentation.callActivityOnDestroy()->activity.performDestroy()
}
::handleLaunchActivity重新启动Activity
```
1)切屏重建Activity,其实ActivityRecord 还是同一个ActivityClientRecord也没有新建,还是之前的那个,但是Activity是重新构建了一个。
2)8步骤performPauseActivity 中调用了callActivityOnSaveInstanceState ,所以我们在Activity中的onSaveInstanceState的bundle可以存数据,实际上就是存在ActivityClientRecord中,所以在Activity重建的时候,可以取用到。
3)8步骤retainNonConfigurationInstances在onDestroy 之前执行,这里我们可以存储数据,其实也是保存在ActivityClientRecord中。比如ViewModel就是在这里做保存的,所以切屏的时候,ViewModel并没有被销毁掉。