Java onSaveInstanceState()和包

Java onSaveInstanceState()和包,java,android,Java,Android,它是关于void onSaveInstanceState(Bundle saved)和一个基本的java概念 在调用此方法之前必须创建一个Bundle对象,然后将其传递给此方法。 假设它是这样创建和传递的: Bundle savedInstanceState= new Bundle(); onSaveInstanceState(savedInstanceState); 此方法将数据保存在该捆绑包中。但它不会返回该捆绑包(它已将名称-值对添加到该捆绑包中) 因此,保存的bundle(声明为参数变

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

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

Bundle savedInstanceState= new Bundle();
onSaveInstanceState(savedInstanceState);
此方法将数据保存在该捆绑包中。但它不会返回该捆绑包(它已将名称-值对添加到该捆绑包中)

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

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

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

如果有人能帮我理解这个概念,我将不胜感激。
是的,我已经阅读了活动API中给出的参考资料。

基于您的问题:

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

我认为你完全忽略了方法本身的全部要点,甚至超出了参数的范围,该参数使你有机会在重新创建后收集一些你可能感兴趣的信息,该方法的要点是让你知道,一种可能使对象失去其状态的机制即将启动。例如,您可以注意到,该方法在设备旋转时执行,活动的“重新创建”将影响对象的当前状态,使您有机会保存信息并在“onRestoreInstanceState”中使用它,此外,您可能会注意到,如果按back键并关闭某个活动,它将不会被执行,因为您不再关心这些对象的状态,因此除了您在bundle中获得的内容(这是您的填充责任)之外,这种方法的重要性在于让你知道一些会破坏你的国家的事情即将开始,你应该采取预防措施

希望这能澄清你的问题


问候

因此,假设您在自定义活动中重写了
onSaveInstanceState
方法,类似于:

public void onSaveInstanceState(Bundle dataToBeSaved) {
    super.onSaveInstanceState(dataToBeSaved);
    dataToBeSaved.putString("myKey", "myImportantStringValue"); 
    //populate bundle with more data
} 
以下是当您的活动被终止并有机会保存一些数据时发生的情况(简化):

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

希望这能为您澄清问题。

方法范围不适用于您对所获得的对象所做的修改。这些变化仍然存在。唯一停止存在的是您对该对象(即名为
已保存的
)的引用(副本),而该对象的实际实例可以在其他地方使用。@用户我用Zaply的注释更新了我的答案您可以在
onCreate()
中获得对具有相同内容的
捆绑包的引用。不一定是同一个实例,因为保存的实例状态可能会在应用程序被终止一段时间后继续存在。应在应用程序进程中结束。它似乎是IPC从那里转移到
ActivityManagerService
Bundle
Parcellable
),所以Android可以终止应用程序进程。对。显然,保存状态发生在
IActivityManager
的实际实现代码中的某个地方。谢谢你的原创评论。
public void onSaveInstanceState(Bundle dataToBeSaved) {
    super.onSaveInstanceState(dataToBeSaved);
    dataToBeSaved.putString("myKey", "myImportantStringValue"); 
    //populate bundle with more data
}