【问题标题】:onSaveInstanceState() and the bundleonSaveInstanceState() 和包
【发布时间】:2013-11-06 05:22:07
【问题描述】:

它是关于 void onSaveInstanceState(Bundle saved) 和一个基本的 java 概念。

在调用该方法之前必须创建一个Bundle对象,然后将其传递给该方法。 假设它是这样创建和传递的:

Bundle savedInstanceState= new Bundle();
onSaveInstanceState(savedInstanceState);

此方法将数据保存在该包中。但它不会返回那个包(它已经添加了名称-值对)。

public void onSaveInstanceState(Bundle saved){
. . . //data added to the bundle named saved
} 

因此,被声明为参数变量的已保存包仅在方法中具有作用域。在方法内部添加到 save 的数据不会添加到 savedInstanceState。 该方法也没有返回任何内容。

那么当它不改变自身外部的任何包并且也不返回任何东西时,这个方法的意义是什么?

我们也说传递给 onCreate 的包携带了之前保存的活动冻结状态。似乎这个包来自 onSavedInstanceState() 中的处理,但该方法不返回任何内容,也不会更改传递给它的包的值,在它自身之外。我很困惑。

如果有人能帮助我理解这个概念,我将不胜感激。 是的,我已阅读 Activity API 中给出的参考。

【问题讨论】:

  • 方法范围不适用于您对获得的对象所做的修改。这些变化仍然存在。唯一停止存在的是您对该对象的(a)引用(即名为saved的对象),而该对象的实际实例可以在其他地方使用。
  • @user 我用 zapl 的 cmets 更新了我的答案

标签: java android


【解决方案1】:

因此,假设您在自定义活动中覆盖 onSaveInstanceState 方法,如下所示:

public void onSaveInstanceState(Bundle dataToBeSaved) {
    super.onSaveInstanceState(dataToBeSaved);
    dataToBeSaved.putString("myKey", "myImportantStringValue"); 
    //populate bundle with more data
} 

当您的活动被杀死并有机会保存一些数据时,会发生以下情况(简化):

  • Android 系统将创建Bundle data = new Bundle();,正如您在问题中正确陈述的那样。
  • Android 将调用您的 activity.onSaveInstanceState(data); 传递对刚刚创建的 Bundle 对象的引用。
  • 您的onSaveInstance 方法接收该引用的副本(在您的方法中命名为dataToBeSaved)。请注意,此引用(及其副本)指的是由系统管理的Bundle 对象。因此,您的方法将填充此系统管理的 Bundle 对象。
  • 在您的 Activity 重新启动时,系统会保留修改后的 Bundle 对象
  • 当您的活动返回时,系统将调用您的activity.onCreate(data);,并传递[引用]这个先前存储的Bundle
  • 在您的onCreate() 中,您将获得一个对Bundle 对象的引用,该对象的内容与您在onSaveInstanceState() 中访问的对象相同
    [基于评论的编辑] 您将获得对完全相同的Bundle 或其重新创建的副本的引用,具体取决于系统在活动/进程重新启动之间管理内存的方式,这与开发人员无关。

希望能为你澄清事情。

【讨论】:

  • 你会得到一个对 Bundle 的引用,该引用与 onCreate() 中的内容相同。不一定是同一个实例,因为保存的实例状态可能会在您的应用被终止一段时间后继续存在。
  • 应该在应用程序进程中以 ActivityClientRecord.state 结束。似乎是IPC从那里转移到ActivityManagerService?BundleParcellable)所以Android可以杀死应用进程。
  • 正确。显然保存状态发生在here 的实际实现代码IActivityManager 的某处。感谢您的原始评论。
【解决方案2】:

根据您的问题:

那么当它不改变自身外部的任何包并且也不返回任何东西时,这个方法的意义是什么?

我认为你完全错过了方法本身的全部意义,甚至超出了接受并让你有机会在重新创建后收集一些你可能感兴趣的信息的参数,这个方法的重点是让你知道一种可能使对象失去其状态的机制即将启动。例如,您可以注意到该方法在您的设备旋转时执行,并且活动的“重新创建”将影响对象的当前状态,让您有机会保存信息并在“onRestoreInstanceState”中使用它,你也可能注意到,如果你按下并关闭一个活动,它不会被执行,因为你不再关心那些对象的状态,所以除了你在包中得到的任何东西(这是你填充的责任),这个的重要性方法是让你知道会破坏你的状态的事情即将开始,你应该采取预防措施......

希望这能澄清您的问题...

问候!

【讨论】:

    猜你喜欢
    • 2011-05-05
    • 2011-07-07
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多