生命周期方法 onCreate() 中的实际 savedInstanceState 对象在哪里?
Where is the actual savedInstanceState object in lifecycle method onCreate()?
对象savedInstanceState在哪里实例化的?它不应该在某个地方说,像这样 val savedInstance = SavedInstanceState()
吗?
MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
由平台代码实例化。更具体地说,负责跟踪 Activity 应用程序状态的主要系统组件是 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
.
的大量状态
我可以继续向该机制添加详细信息,但希望它足以删除 "magic" 如何获得 savedInstanceState
。
对象savedInstanceState在哪里实例化的?它不应该在某个地方说,像这样 val savedInstance = SavedInstanceState()
吗?
MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
由平台代码实例化。更具体地说,负责跟踪 Activity 应用程序状态的主要系统组件是 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
.
我可以继续向该机制添加详细信息,但希望它足以删除 "magic" 如何获得 savedInstanceState
。