按下返回键 - 避免销毁活动。

3
我有两个活动 - 活动A启动活动B。然后,活动B从数据库加载一些数据,并可视化这些数据。完全初始化B中的所有内容需要一些时间(5-10秒)。
我的问题是,如果我在B中按下返回按钮,它会销毁B活动(调用onDestroy)并返回到活动A。我仍然想返回到活动A,但是不要销毁B,因为如果我再次启动B,我必须再次等待它完成所有的操作(这很烦人)。有没有可能实现这个目标?
谢谢你的帮助!
5个回答

5
你可以使用“Fragment”来实现,但你真正想要做的是缓存信息。否则,在设备旋转时,你仍然会重新加载(除非你使用“Fragment”并将“setRetainInstance”设置为true,但这可能会引起其他问题)。
我建议在Activity B的“onCreate”中使用“CursorLoader”。在“onLoadFinished”中,你可以缓存结果并设置你的UI。在随后的加载中,结果将被缓存,你无需再使用loader。此外,使用“CursorLoader”还会提醒你底层数据库结果是否发生变化。

这是正确的答案,就像@Orabîg所说,你永远无法要求Android保持活动状态。当内存不足时,Android可以回收任何活动。 - Snicolas
谢谢,我会研究一下Fragment。我知道我不能强制Android不杀死Activity。我只是期望在你返回A并且几分钟后想再次转到B的平均情况下... - Jaa-c
再次强调,片段可能甚至无法正常工作,即使它们能够正常工作,也会带有一些你应该非常清楚的细微差别。请参阅http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance%28boolean%29我更愿意建议您研究Loaders。 - yarian
1
此外,您需要处理屏幕方向。即使在这种情况下,活动也会被销毁并重新创建。 - Raghunandan
@Raghunandan:谢谢,我知道这个。但是我不指望方向经常改变,我关心的是平均情况。 - Jaa-c

2

我认为你没有从正确的角度看待这个问题。

如果Android想要销毁B,那么你无法阻止它(因为处理活动是由Android负责的)。 但是,你可以选择将所有长时间初始化的工作放在第三个类中,并始终保持该类。因此,你应该使这个初始化阶段与你的B活动无关。

我认为将所有这些内容放在你的Application类的属性中是一个好主意。


谢谢,但我不想管理第三类,在其中暂时持久化初始化数据,因为有更多的B实例具有不同的数据(并且数据定期更新),所以这将非常复杂... - Jaa-c
你可以随意选择,但我认为你没有太多的选择。而且我不明白你的论点说明为什么不能使用外部类。希望你能找到最好的解决方案。 - Orabîg

0

0
使用SharedPreferences来存储键值对,然后使用getSharedPreferences()来检索它们。

0

当您按下返回按钮时,Activity b 将被销毁。这是 Android 的工作方式。我不会尝试覆盖默认功能。

一旦您从数据库中获取数据,您可以将其缓存到某个地方并加载它。

http://developer.android.com/guide/topics/data/data-storage.html。请查看“保存缓存文件”主题。


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