Android 横竖屏切换发生了啥?

1,326 阅读1分钟
  当屏幕从竖屏切换到横屏的时候,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并没有被销毁掉。