问题 尽可能防止活动被破坏


我有一个应用程序,一个包含片段的活动应用程序。

这个应用程序的通常用例是,你启动它并把电话拿走,不时,你回到手机并插入一些数据...这是一个日志应用程序,你正在做一些事情并插入你的结果进入应用程序...

我有这个问题,不时地,我的活动被摧毁并用空包重新创建......(大多数时候情况并非如此,但偶尔会发生这种情况......)。我的应用程序有时会启动服务,即使这种服务在这种情况下被杀死......

这意味着系统已杀死我的应用程序,是吗?我怎么能避免这个?

我需要保留用户数据和当前的顶级片段......并且它们被保存到捆绑包中,只要状态和数据得到保存,一切正常...

顺便说一句,我的活动始终是TOP ACTIVITY,只是屏幕经常关闭......我只想让我的活动尽可能长时间活着,直到用户离开后面的按钮......或者保存状态可靠

重要的提示

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


7543
2018-03-04 09:46


起源

你不能阻止android杀死你的应用程序,你可能也会被杀死...我不确定你应该如何保存你的活动状态并在重新创建时恢复它。 - Ayoub
你应该照顾你的活动当前状态,有一些活动状态,然后你可以序列化或保存在共享的偏好...并检查活动的开始 - Darko Rodic
您可以阻止屏幕锁定 stackoverflow.com/questions/3723634/... 并且您可以创建一个应用程序类并将静态变量放入其中,以便保持更长时间 - barisemreefe


答案:


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

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

如果你真的想要这个使用唤醒锁。这会耗尽你的用户电池,所以在实施这个之前我要三思而后行 如何防止Android设备以编程方式进入睡眠状态?

onSaveInstanceState解释

为此,请检查捆绑包中需要哪些信息,并将该信息保存在 onSaveInstanceState(bundle:Bundle) 方法,以便您可以重复使用它 onCreate(sameBundle:Bundle)

有关Google文档的更多信息,请访问: 保存您的活动状态 和 恢复您的活动状态

关于Android Activity生命周期

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

更多信息在 Android:不从活动中调用onSaveInstanceState


8
2018-03-04 10:03



正如我在帖子中写的那样,它只发生了一些......所以有时,onSaveInstance不起作用,我的活动将用EMPTY包重新创建......当然,大部分时间这都有效...而且我是这样做就好了...我知道,android会杀死我的应用程序,因为它认为它不再需要了(例如,屏幕),但在我的情况下,这是错误的......我想过使用一个前台服务,并将其绑定到我的活动,以解决我的问题...但我宁愿选择一个解决方案,允许我的应用程序被杀死,但正确恢复,总是......不仅大多数时候...... - prom85
那你应该尝试调试这个。您可以检查选项表单开发选项,以便始终销毁活动以强制存储包,然后使用应用程序的一些不同用例进行测试。开发者选项>不要保持活动(在底部) - hcpl
实际上,我做了...这是有效的,如果 onSaveInstanceState 被称为......但他们不能保证它被称为(因为它不是生命周期的一部分)......这是我的问题......我只是想,其他人可能已经解决了某种方式...... - prom85
好的,根据这个答案,你确实有一点。解决方案是将其保存在onPause方法中,因为这是生命周期的一部分。这是一个可靠的工作。 stackoverflow.com/questions/12793069/... - hcpl
我已经读过了(我知道这个解决方案)...我仍然不确定,如果信息完整......实际上,我仍然不知道我是否可以肯定,onSaveInstance总是被称为每当系统破坏我的活动时...我的生活测试显示,我不能......但我不确定,如果他们的应用程序中可能存在错误,或者我真的不能确定这个功能被称为......你知道吗?如你的链接中所写,似乎只是跳过了函数,如果用户按下或调用了finish方法......我不确定这是否正确... - prom85


我有一个类似的问题,我在搜索解决方案时到达了这个帖子,你必须使用清单来实现这一点,并且还要了解Android生态系统中究竟是什么活动,

在Android活动中,任务具有预定义的工作。

我在文档中挖掘了很多,我发现,我们可以通过两种方式配置活动,

  1. 一贯
  2. 非持久

如果你提到清单中的活动为

android:persistent="true"

并运行以下用例

  1. 启动APP
  2. 按返回或主页按钮
  3. 您再次选择后堆栈中的活动以将其置于前面

活动进入开始 - >暂停 - >停止 - >恢复,它没有进入onDestroy方法。

如果不提

android:persistent="true"

对于相同的用例

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

活动进入resume-> create-> start

如果要在活动启动时运行服务/任务,并在应用程序处于后台堆栈时继续运行,则必须在onCreate方法中启动它,并通过在清单中将活动指定为持久性来终止它们。

我希望我的上述解决方案可以帮助其他人来到这里解决同样的问题


2
2018-03-04 06:49



Android活动不支持此属性。它仅适用于应用程序。检查 developer.android.com/guide/topics/manifest/... 详情。 - jekatt
@jekatt你可以查看这个链接, developer.android.com/guide/topics/manifest/... - aravind.udayashankara
正确,但这是应用程序而不是活动。此属性不能用于“将活动配置为持久性”。从文档:“持久模式仅适用于某些系统应用程序”。如果您的应用是系统应用,它将使应用进程保持运行,而不是单个活动。您还可以查看此链接以获取更多信息: groups.google.com/forum/#!topic/android-platform/nU0e3aoBlSY - jekatt
@jekatt它也适用于活动,请尝试它为我工作 - aravind.udayashankara
活动在应用程序上下文中运行,如果应用程序进程保持活动状态,它当然也会影响活动的生命周期,但Android已为此类用例引入了专用技术。 (服务和通知以使服务前景化)。从上面发布的链接检查Dianne Hackborn(Android框架工程师)的引用:“除了核心平台代码之外,你真的不应该使用它。在整个Android平台中,只有一件事使用它:手机应用程序。 ..(也就是说,手机非常关键的代码。)“ - jekatt