onSaveInstanceState()和bundle

时间:2013-11-05 19:57:51

标签: java android

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

必须在调用此方法之前创建Bundle对象,然后将其传递给此方法。 让我们说它是这样创建和传递的:

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

此方法可保存该捆绑包中的数据。但它不会返回该包(它已添加了名称 - 值对)。

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

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

那么当这个方法没有改变任何外部的包而且没有返回任何东西时,这个方法有什么意义呢?

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

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

2 个答案:

答案 0 :(得分:1)

根据您的问题:

  

那么当这个方法没有改变任何外部的包而且没有返回任何东西时,这个方法有什么意义呢?

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

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

问候!

答案 1 :(得分: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对象。
  • 系统会在重新启动活动时保留已修改的Bundle对象
  • 当您的活动恢复后,系统会调用activity.onCreate(data);传递[引用]以前存储的Bundle
  • onCreate()中,您会获得Bundle对象的引用,其内容与您在onSaveInstanceState()中访问的内容相同 [基于评论的编辑]您将获得完全相同的Bundle或其重新创建的副本的引用,具体取决于系统如何在活动/进程重新启动之间管理内存,这与开发人员无关。

希望能为你澄清事情。