尽可能长时间地防止活动被破坏

Posted

技术标签:

【中文标题】尽可能长时间地防止活动被破坏【英文标题】:Prevent activity from being destroyed as long as possible 【发布时间】:2014-04-05 18:31:12 【问题描述】:

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

此应用程序的通常用例是,您启动它并把手机收起来,然后不时地回到手机并插入一些数据......这是一个日志应用程序,您正在做某事并且将您的结果插入应用程序...

我有一个问题,我的活动不时被破坏并用一个空包重新创建......(大多数时候情况并非如此,但时不时会发生这种情况......) .我的应用有时会启动一个服务,甚至在这种情况下这个服务也会被杀死......

这意味着,系统已经杀死了我的应用程序,是吗?我怎样才能避免这种情况?

我需要保留用户数据和当前的***片段......并且它们被保存到包中,只要它们的状态和数据被保存,一切都会正常工作......

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

重要提示

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

【问题讨论】:

你不能阻止 android 杀死你的应用程序,你可能也会被杀死......我不知道如何但你应该能够保存你的活动状态并在重新创建时恢复它. 你应该注意你的活动当前状态,有一些活动状态,然后你可以序列化或保存在共享首选项中......并检查活动的开始 您可以防止屏幕锁定***.com/questions/3723634/…,您可以创建一个应用程序类并将您的静态变量放入其中,这样可以保持更长的时间 【参考方案1】:

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

您不想阻止 Android 杀死您的应用。您想要的是正确恢复应用程序的状态。然后用户将永远不会注意到应用程序已被销毁,并且用户仍然可以从不使用时被销毁的应用程序中受益。

如果你真的想要这个,请使用唤醒锁。这会耗尽你的用户电池,所以我在实施这个之前三思而后行......How do I prevent an Android device from going to sleep programmatically?的信息@

onSaveInstanceState 解释

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

更多信息请参阅 Google 文档,网址为 Save your Activity state 和 Restore your Activity State。

关于 Android Activity 生命周期

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

更多信息Android: onSaveInstanceState not being called from activity

【讨论】:

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

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

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

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

    持续 非持久性

如果您将清单中的活动提及为

android:persistent="true"

并运行以下用例

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

Activity 进入 start -> pause -> stop -> resume ,并没有进入 onDestroy 方法。

如果不提

android:persistent="true"

对于相同的用例

Activity进入start->pause->stop->destroy,如果从back stack中选择activity

Activity进入resume->create->start

如果您想在 Activity 启动时运行服务/任务,该服务/任务在应用程序处于后台堆栈时继续运行,那么您必须在 onCreate 方法中启动它,并通过在清单中将您的 Activity 指定为持久性来杀死它们。

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

【讨论】:

Android 活动不支持此属性。它仅适用于应用程序。详情请查看developer.android.com/guide/topics/manifest/…。 @jekatt 你能检查一下这个链接吗,developer.android.com/guide/topics/manifest/… 正确,但那是应用程序而不是活动。此属性不能用于“将活动配置为持久”。来自文档:“持久性模式仅适用于某些系统应用程序”。如果您的应用程序是系统应用程序,它将保持应用程序进程运行,而不是单个活动。您也可以查看此链接了解更多信息:groups.google.com/forum/#!topic/android-platform/nU0e3aoBlSY @jekatt 它也适用于活动,请尝试它对我有用 @jekatt 就因为只有手机APP用这个,你怎么能断定别人不应该用呢,Dianne Hackborn的方式也是一种方式,我的方式也是一种方式。但意图是一样的。这个帖子的所有者已经要求一种方法来做到这一点,我已经回答了。如果你觉得不合适你可以忽略并发布另一个答案,我不同意我错了,因为这个发布这个问题的人让我感觉他需要创建一个像电话这样的APP APP

以上是关于尽可能长时间地防止活动被破坏的主要内容,如果未能解决你的问题,请参考以下文章

Back Stack 未维护 - 如何防止 Fragment 被破坏?

有意思的java单例模式实现:破坏与防止被破坏

Android:将数据保存到服务器以避免活动破坏

持有C ++引用是否可以防止变量被破坏?

如何使用 CSS 来防止连字符导致 HTML 文本区域中的字符串被破坏?

有啥方法可以防止以角度破坏组件?