onPause / onRestore与savedInstanceState的搭配使用

7
我对Android开发还比较新,需要一些帮助来保存活动的状态。从onPause保存实例并从onRestore恢复实例的正确方法是什么?显然,Android不会像在onCreate或onSaveInstanceState中那样发送savedInstanceState Bundle。或者除了使用savedInstanceState bundle之外,是否有更好的保存方式?
这讲得通吗?
[编辑] 好的,我想我知道我的真正问题是什么了...但首先,我认为我要使用SharedPreferences而不是savedInstanceState。
所以,我正在进行更多的调试日志观察,我注意到它没有将Activity带到堆栈的顶部,而是创建了一个新的Activity。是的,我意识到我正在创建一个新的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不应该阻止它创建新的活动吗?我猜测它认为必须创建一个新的活动,因为我发送了一些字符串?

更好的方法是,如果活动已经在堆栈中,我如何检查并在字符串相同的情况下切换到它? -- 当用户从列表视图中点击媒体项时,我正在启动此活动。 [/编辑]

2个回答

3
出于某些原因,这并没有用非常醒目的霓虹灯标识来进行文档化,并且我花了一段时间才发现,但是如果将 android:launchMode=["multiple" | "singleTop" | "singleTask" | "singleInstance"] 属性设置为"singleInstance",您就不需要担心您的 Activity 是否存在。
然后只会有一个实例,只要该活动尚未被垃圾回收,您的内存字段就会被保留。
另一件事情是创建一个 Application(从 Application 扩展) 并将所有持久对象存储在其中... 它在整个应用程序的生命周期中是首先创建和最后销毁的(包括所有无活动服务)。
只需创建一个应用程序类,并像这样在清单中指定它:
<application android:icon="@drawable/icon" android:label="@string/app_name"
    android:name=".MyApplication">

如果您真的想在应用程序关闭时保存值,只需使用SharedPreferences。这对于涉及IT技术的场景非常有用。


谢谢您的回复。这让我很有希望,但是在将android:launchMode="singleInstance"添加到清单文件后,它仍然会创建一个新的活动。它不应该再次调用onCreate(),对吧?x_X - bwoogie
现在这很有趣...手机的返回按钮会杀死activity吗?因为如果我按下主页按钮并返回到应用程序,则它可以正常工作。 - bwoogie
是的,bwoogie,返回按钮会杀死活动(因此没有保存/加载/任何操作可以将其带回),而主页按钮会将其发送到后台。对我来说,这一点开始时也不是很直观。 - dmon
没错,对于设置为singleInstance的activity,它只会调用一次onCreate。在您的activity显示之前,onResume是最后一个被调用的函数。它会在每次调用(包括onCreate之后)时被调用。 - Yevgeny Simkin
+1 我想用非常非常粗的霓虹闪烁字母添加:默认 launchMode 是 **"standard"**。 - ateiob

1
这个 onRestore 方法是什么?它不是 Activity 生命周期的一部分... 我猜你指的是 onRestart。无论如何,你不会在 onRestart 中得到一个 bundle 是因为你不需要它。你的 activity 没有被正式“杀死”,所以你不需要从保存的状态中恢复。你的 activity 被暂停了,但没有从内存中删除,所以系统只是告诉你它再次可见了。对于这种过渡事件,你可能不需要做任何事情。
除此之外,要做到这一点的方法是,在 onSaveInstanceState() 中保存任何你认为是“状态”值,然后在 onCreate 中恢复它们。之后,你可以在 onCreate 本身或者在 Activity 生命周期的后期(例如 onResume)中恢复任何视图特定的属性。

如果他在谈论onPause,我敢打赌他指的是onResume而不是onRestore。 - Amplify91
是的,我的意思是onResume而不是onRestore。抱歉。 - bwoogie
啊,指针。我认为同样的原则仍然适用。这更多是让你知道它发生了而不是为了保存任何东西。如果你正在处理数据库/内容提供者,文档建议你在onPause时将数据保存到其中,但与活动状态无关。 - dmon
也许我应该更清楚地表明我正在保存什么。实际上,它是来自在线 xml 文件的当前播放音频文件。如果用户离开活动(而音频仍在播放),然后回来,我需要检查他们是否选择了不同的文件或继续播放当前文件,并相应地更新播放器。 - bwoogie
我理解@bwoogie的问题,一直在寻找解决方案,直到分心了。@dmon:需要编写onPause,以便如果Android需要资源,可以从原始程序中取走内存。您不能假设信息会被放入安全状态... - Rasman
你能给我一个在onPause()方法中保存Bundles的例子吗? - laplasz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接