尽可能防止活动被销毁

16

我有一个应用程序,是一个单活动应用程序,其中包含片段。

通常使用此应用程序的情况是,您启动它并将手机放在一旁,然后时不时地回到手机并将一些数据插入... 它是一个日志记录应用程序,您正在进行某些操作并将结果插入应用程序中...

我的问题是,偶尔我的活动会被销毁并以空捆绑重建...(大多数情况下不是这种情况,但偶尔会发生...)。即使在这种情况下,我的应用程序有时也会启动服务,但甚至此服务也会被杀死...

这意味着系统已经杀死了我的应用程序,是吗?我该如何避免这种情况?

我需要保留用户数据和当前顶部片段... 并将它们保存到bundle中,只要它们的状态和数据得到保存,一切都可以正常工作...

顺便说一句,我的活动始终是TOP ACTIVITY,只是屏幕经常关闭... 我只想尽可能地让我的活动保持活动状态,直到用户使用返回按钮离开它... 或者可靠地保存状态。

重要提示

onSaveInstance并不总是有效(它不是生命周期的一部分,因此不能保证被调用)... 它只在大多数情况下有效... 我需要一种始终有效的方法... 如果Android杀死了我的应用程序...


你不能阻止安卓系统杀死你的应用,否则你的应用也可能会被杀掉...我不确定具体方法,但你应该能够保存你的活动状态,并在重新创建时恢复它。 - Ayoub
你应该关注你的活动当前状态,为其设定一些状态并进行序列化或保存在共享首选项中...在活动启动时进行检查。 - Darko Rodic
你可以通过编程的方式防止屏幕锁定 https://dev59.com/tW865IYBdhLWcg3wnf9t,同时你可以创建一个应用程序类并将静态变量放入其中,以便它们能够更长时间地保持。 - barisemreefe
2个回答

9

不要将应用程序保留在内存中

您不希望阻止Android销毁您的应用程序。您想要做的是正确恢复应用程序的状态。然后,用户永远不会注意到应用程序已被销毁,并且用户仍然可以获得在不使用时被销毁的应用程序的好处。

如果您真的需要这样做,请使用Wakelock。这将耗尽用户的电池,因此在实现之前请三思...有关信息,请访问如何通过编程方式防止Android设备进入休眠状态?

解释onSaveInstanceState方法

要做到这一点,请检查包中需要哪些信息,并使用onSaveInstanceState(bundle:Bundle)方法持久化该信息,以便您可以在onCreate(sameBundle:Bundle)中重复使用它。

有关更多信息,请访问Google文档:保存Activity状态还原Activity状态

关于Android Activity生命周期

如下方评论中@prom85所述,不能保证会调用onSaveInstanceState方法,因为它不是生命周期的一部分。解决此问题的方法是使用onPause生命周期钩子确保您的数据已存储。

有关更多信息,请访问Android:从Activity未调用onSaveInstanceState


正如我在帖子中所写的,这种情况只会偶尔发生... 因此,有时 onSaveInstance 不起作用,我的活动将被重新创建为一个空包... 当然,大多数情况下这是有效的... 而且我已经这样做了... 我知道,Android 会杀死我的应用程序,因为它认为它不再需要(例如屏幕关闭),但在我的情况下,这是错误的... 我考虑过使用前台服务并将其绑定到我的活动以解决我的问题... 但我更喜欢一种解决方案,允许我的应用程序被杀死,但始终能够正确地恢复... 而不仅仅是大多数情况下... - prom85
那么你应该尝试进行调试。您可以检查开发选项中的选项表单,以始终销毁活动以强制存储捆绑包,然后使用应用程序的一些不同用例进行测试。 开发人员选项> 不保留活动(在底部) - hcpl
事实上,如果onSaveInstanceState被调用,则会起作用...但是并不能保证它被调用(因为它不是生命周期的一部分)...这就是我的问题...我只是想,其他人可能已经以某种方式解决了这个问题... - prom85
根据这个stackoverflow的答案,你是正确的。解决方案是将它保存在onPause方法中,因为那是生命周期的一部分。这是一个很好的解决办法。https://dev59.com/nGcs5IYBdhLWcg3wgkMQ - hcpl
我已经阅读了这个解决方案,但我仍然不确定信息是否完整。实际上,我仍然不知道当系统销毁我的活动时,onSaveInstance是否总是被调用。我的生活测试表明我不能肯定。但我不确定我的应用程序中是否存在错误,或者我是否真的不能确定该函数是否被调用。你知道吗?正如你链接中所写的那样,似乎只有在用户按下返回键或调用finish方法时才会跳过该函数。我不确定这是否正确。 - prom85

6

我遇到了类似的问题,当我在寻找解决方案时,我发现了这篇文章。要实现这一点,您需要对清单文件进行调整,并且还需要了解在Android生态系统中“activity”是什么。

在Android中,“activity”是具有预定义工作的任务。

我在文档中进行了大量研究,发现我们可以通过两种方式配置“activity”:

  1. 持久
  2. 非持久

如果您在清单文件中为“activity”指定了以下内容:

android:persistent="true"

并运行以下用例

  1. 启动APP
  2. 按下返回键或主页键
  3. 选择回退堆栈中的活动,以将其带到前台

活动进入开始 -> 暂停 -> 停止 - > 恢复状态,不会进入onDestroy方法。

如果不提及

android:persistent="true"

对于相同的使用情况

活动进入开始 -> 暂停 -> 停止 -> 销毁,如果您从后台堆栈中选择活动

活动进入恢复 -> 创建 -> 开始

如果您想在活动启动时运行一个保持运行的服务/任务,即使应用程序在后台堆栈中也会继续运行,则必须在onCreate方法中启动该服务/任务,并通过在清单中指定您的活动为持久性来在onDestroy中停止它们。

我希望我的解决方案可以帮助其他遇到相同问题的人。


4
Android活动(Activities)不支持此属性。该属性仅适用于应用程序。请查看https://developer.android.com/guide/topics/manifest/application-element.html 以获取详细信息。 - jekatt
正确,但这是应用程序而不是活动。此属性不能用于“配置活动为持久性”。 从文档中可以看出:“持久性模式仅适用于某些系统应用程序”。 如果您的应用程序是系统应用程序,则会保持应用程序进程运行,而不是单个活动。 您还可以查看此链接以获取更多信息:https://groups.google.com/forum/#!topic/android-platform/nU0e3aoBlSY - jekatt
@jekatt 它也适用于活动,请尝试,它对我有效。 - Aravind.HU
1
@jekatt 仅因为只有手机应用程序使用这个,你怎么能下结论说其他人不应该使用它,Dianne Hackborn 的方式也是一种方式,我的方式也是一种方式,但意图是相同的。该帖子的所有者要求提供一种方法来实现这一点,我已经回答了。如果你觉得这不是一个合适的选择,你可以忽略并发布另一个答案,我不认为我是错的,因为那个发布这个问题的人让我觉得他有创建类似于手机应用程序的需求。 - Aravind.HU
因为它写在文档中。解决方案不是阻止Android管理活动的生命周期。解决方案是处理这些类型的生命周期步骤,并正确地重新创建活动,即使它已被销毁。这可以通过实现带有前台通知的清洁服务来实现。 - jekatt
显示剩余3条评论

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