【问题标题】:Where is the actual savedInstanceState object in lifecycle method onCreate()?生命周期方法 onCreate() 中实际的 savedInstanceState 对象在哪里?
【发布时间】:2019-10-14 16:29:48
【问题描述】:

对象 savedInstanceState 在哪里实例化?它不应该在某个地方说,像这样val savedInstance = SavedInstanceState()吗?

MainActivity : AppCompatActivity() {

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

【问题讨论】:

  • developer.android.com/guide/components/activities/…也许官方文档可以给你这个问题的线索。
  • 一个Bundle 被传递给你,你并不需要知道它在哪里或如何被实例化。从我收集到的savedInstanceState 的实际创建在ActivityThread#callActivityOnSaveInstanceState 中,这是一个实现细节。
  • @Sandi 谢谢你是对的,但是我需要更多信息才能真正找到表达式 > r.state = new Bundle() 才能真正说服我。我希望看到代码相信它,而 Enselic 给我的答案成功了。

标签: android oop kotlin android-lifecycle


【解决方案1】:

它由平台代码实例化。更具体地说,负责跟踪应用程序活动状态的主要系统组件是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 是您通过的savedInstanceStateActivityClientRecordActivity 保存大量状态。

我可以继续为这个机制添加细节,但希望它足以消除你如何获得savedInstanceState 的“魔力”。

【讨论】:

  • 非常感谢,这正是我想要的。我实际上找到了电话 > r.state = new Bundle();在函数内部 > callCallActivityOnSaveInstanceState(ActivityClientRecord r) 这确实为我消除了“魔力”。我很高兴找到 new 关键字。我现在可以睡得很开心了
猜你喜欢
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 2014-08-05
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
相关资源
最近更新 更多