【问题标题】:onPause / onRestore with savedInstanceStateonPause / onRestore with savedInstanceState
【发布时间】:2011-08-12 15:48:54
【问题描述】:

我是 android 开发的新手,我需要一些帮助来保存活动的状态。 从 onPause 保存实例并从 onRestore 恢复它的正确方法是什么,因为显然 Android 没有像使用 onCreate 或 onSaveInstanceState 那样发送 savedInstanceState Bundle。或者有没有比使用 savedInstanceState 包更好的保存方法?

这有意义吗?

[编辑] 好的,我想我知道我真正的问题是什么......但首先,我认为我正在寻找的是使用 SharedPreferences 而不是 savedInstanceState。

因此,在查看更多调试日志时,我注意到不是将 Activity 带到堆栈顶部,而是创建一个新的。是的,我意识到我正在创建一个新的......

         Intent itemintent = new Intent(MediaList.this, AudioPlayer.class);

         Bundle b = new Bundle();
        //...putString some strings to send
         itemintent.putExtra("android.intent.extra.INTENT", b);
         itemintent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
         startActivityForResult(itemintent,0);

...但是 FLAG_ACTIVITY_REORDER_TO_FRONT 不应该阻止它创建新活动吗?我猜它认为它必须创建一个新的,因为我正在发送一些字符串?

更好的是,只要字符串相同,我如何检查活动是否已经在堆栈中并切换到它? - 当用户从列表视图中单击媒体项目时,我开始此活动。 [/编辑]

【问题讨论】:

    标签: android onpause


    【解决方案1】:

    由于某种原因,这并没有记录在非常非常大胆的霓虹闪烁字母中,我花了一段时间才发现,但是如果您只需使用 机器人:launchMode = [“多个” | “单顶” | “单任务” | “单一实例”] 属性设置为“singleInstance”。

    那么它只有一个实例,只要活动没有被垃圾收集,你的内存字段就会被保留。

    您可以做的另一件事是创建一个应用程序(从应用程序扩展)并将所有持久对象存储在其中...就您的整个应用程序的生命周期而言,它首先创建并最后销毁(包括您所有的无活动服务)。

    只需创建一个 Application 类并在清单中指定它,如下所示:

    <application android:icon="@drawable/icon" android:label="@string/app_name"
        android:name=".MyApplication">
    

    如果您仍然真的想在应用程序将要关闭的情况下保存您的值,只需使用 SharedPreferences。

    【讨论】:

    • 感谢您的回复。给了我很高的希望,但在将 android:launchMode="singleInstance" 添加到清单文件后,它仍在创建一个新活动。它不应该再次调用 onCreate() 对吗? x_X
    • 现在这很有趣...手机的后退按钮会终止活动吗?因为如果我点击主页按钮并返回应用程序,它会正常工作。
    • 是的 bwoogie,后退按钮会终止活动(因此没有保存/加载/任何将其带回的内容),而主页按钮将其发送到后台。一开始这对我来说也不是很直观。
    • 没错,它只会在设置为 singleInstance 的活动上调用一次 onCreate。 onResume 是显示活动之前调用的最后一件事。每次都会调用它(包括在 onCreate 之后)
    • +1 我想添加非常大胆的霓虹闪烁字母:默认 launchMode“标准”。跨度>
    【解决方案2】:

    你说的onRestore 方法是什么?它不是 Activity 生命周期的一部分……我猜你的意思是onRestart。无论如何,您没有获得onRestart 的捆绑包的原因是您不需要捆绑包。您的活动尚未被正式“杀死”,因此您无需从已保存状态恢复。您的活动已暂停,但并未从内存中删除,因此系统只是告诉您它再次可见。对于这种过渡事件,您可能不需要做任何事情。

    除此之外,执行此操作的方法是将任何您认为是“状态”值的内容保存在 onSaveInstanceState() 中,然后将它们恢复到 onCreate 中。之后,您可以在 onCreate 本身上或在 Activity 生命周期的后期(例如 onResume)恢复任何特定于视图的属性。

    【讨论】:

    • 如果他说的是 onPause,我敢打赌他指的是 onResume 而不是 onRestore。
    • 是的,我的意思是 onResume 不是 onRestore。对不起。
    • 啊,点。我认为同样的原则仍然适用。让你知道它发生了比你拯救任何东西更重要。如果您正在处理数据库/内容提供程序,文档建议您将数据保存到它 onPause,但与活动的状态无关。
    • 也许我应该更清楚地说明我在保存什么。它实际上是来自在线 xml 文件的当前正在播放的音频文件。我需要检查用户是否离开活动(在音频仍在播放时)并返回,如果他们选择了不同的文件或继续播放当前文件并相应地更新播放器。
    • 我了解@bwoogie 的问题,我一直在寻找解决方案,直到我分心。 @dmon:需要编写 onPause 以便如果 Android 需要资源,它可以从原始程序中占用内存。你不能假设信息被置于安全状态......
    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多