Где находится фактический объект selectedInstanceState в методе жизненного цикла onCreate ()? - PullRequest
0 голосов
/ 14 октября 2019

Где находится объект saveInstanceState? Разве это не должно говорить где-то, что-то вроде val savedInstance = SavedInstanceState()?

MainActivity : AppCompatActivity() {

   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.activity_main)
   }
}

1 Ответ

1 голос
/ 14 октября 2019

Создается с помощью кода платформы. В частности, основным системным компонентом, отвечающим за отслеживание состояний активности приложений, является ActivityManagerService . Этот компонент перенаправляет информацию о savedInstanceState в соответствующие процессы приложения.

Как только процесс приложения получает эту информацию, он запускает локальный код для управления, например, savedInstanceState. Если вы установите точку останова в вашем onCreate(), вы можете исследовать стек вызовов, которые приводят к вашему onCreate() методу. Именно из этого стека вызовов savedInstanceState происходит. Он может быть различным для разных версий Android, но в моем случае на Android 10 этот стек выглядит следующим образом:

onCreate:183, MainPagerActivity (com.mydomain.android.activity)
performCreate:7802, Activity (android.app)
performCreate:7791, Activity (android.app)
callActivityOnCreate:1306, Instrumentation (android.app)
performLaunchActivity:3245, ActivityThread (android.app)
handleLaunchActivity:3409, ActivityThread (android.app)
execute:83, LaunchActivityItem (android.app.servertransaction)
executeCallbacks:135, TransactionExecutor (android.app.servertransaction)
execute:95, TransactionExecutor (android.app.servertransaction)
handleMessage:2016, ActivityThread$H (android.app)
dispatchMessage:107, Handler (android.os)
loop:214, Looper (android.os)
main:7356, ActivityThread (android.app)
invoke:-1, Method (java.lang.reflect)
run:492, RuntimeInit$MethodAndArgsCaller (com.android.internal.os)
main:930, ZygoteInit (com.android.internal.os)

Например, вы можете видеть, что код в цепочке вызовов такой (просто поднимите вверхстек в отладчике Android Studio):

    private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {

и чуть дальше:

                activity.mCalled = false;
                if (r.isPersistable()) {
                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                } else {
                    mInstrumentation.callActivityOnCreate(activity, r.state);
                }

, где r.state - это savedInstanceState, который вы передали. ActivityClientRecord содержит много состояний для Activity.

Я мог бы продолжать добавлять детали к этому механизму, но, надеюсь, этого достаточно, чтобы убрать "магию" того, как вы получаете savedInstanceState.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...