防止应用程序被销毁

14

我从一个活动中发送意图到相机,我是这样调用的:

 Intent testphoto = new Intent(Dashboard.this,CameraHandler.class);
 startActivity(testphoto);

CameraHandler 类中,我调用相机:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, 0);

但在CameraHandler类中调用onActivityResult之前,活动已被销毁。有没有办法防止这种情况发生?

找到了答案:我在AndroidManifest中设置了noHistory="true",这导致操作系统在结果出现之前销毁了活动。


你怎么知道它被销毁了? - dymmeh
我在OnDestroy()方法中添加了一个日志,我尝试使用仅有一个活动的单个应用程序,它能够正常工作,但是当我开始在一个更复杂的应用程序中使用时,相机返回图像之前活动就被销毁了。 - Diego
如果你已经找到了自己的答案,可以发布并接受自己的答案以关闭问题。谢谢。 - davidcesarino
3个回答

43

请确保您没有开启“不保留活动”开发者选项,因为它会销毁您正在离开的活动。


QA报告了一个问题 - 我只能在他们使用的手机上重现它。我无法弄清楚为什么活动键会退出!直到看到你的评论,我才知道这个设置。谢谢 :) - ajh158
这只发生在我的平板电脑上...问题出在哪里...谢谢伙计 +1 - asok Buzz
7
为什么这还是一个选项?它有太多的副作用! - Lukas Knuth
非常感谢。我一直在努力找出为什么它在模拟器中没有被破坏,而在我的手机上却被破坏了。 - jelmood jasser
这个选项有什么意义啊,我都快疯了还在试图弄明白它。 - marchinram
显示剩余2条评论

4
您不必担心在调用startActivityForResult()时,调用的Activity被销毁会改变期望的行为(即无论父级是否被销毁,子级都会记住将结果传回给父级)。请参见此文章
此外,请注意,虽然有时需要防止Activity被销毁(例如在配置更改等情况下),但通常应该让系统管理后台Activity,不要去干扰Activity的生命周期。一旦启动了新的Activity,就不应该明确地阻止之前的Activity被销毁。

2
唯一的问题是,当我有一个只有一个活动的应用程序时,onActivityResult从未被调用,该活动从未被销毁,但是onActivityResult被调用,现在当在另一个应用程序中时,突然活动被销毁,结果似乎永远不会返回。有什么想法吗? - Diego
也许你的工作流程有些问题。调用 startActivityForResult() 两次似乎很奇怪。当启动实际相机应用程序时,你肯定需要调用 startActivityForResult(),但我不确定你是否需要在 CameraHandler 类中使用它。那么 CameraHandler 类是什么呢?直接从仪表板启动相机应用程序是否可行? - Alex Lockwood
你看过这个了吗?根据你提供的信息,我不能确定你的代码有什么问题,但是如果onActivityResultActivity返回时从未被调用,那肯定是有问题的。你可以查看这里的示例代码,看看是否有帮助。 - Alex Lockwood
@AlexLockwood 你好,请问你能告诉我正确的方法来启动startActivityForResult吗?我遇到了同样的问题,因为activity被杀死了。 - Ando Masahashi
"它不会改变预期的行为" - 当然可以。如果您在活动中保留状态并且不保存该状态。 - Jeffrey Blattman
显示剩余3条评论

-3

此属性不适用于活动:https://developer.android.com/guide/topics/manifest/activity-element.html - jekatt
@jekatt 它确实存在 https://developer.android.com/guide/topics/manifest/application-element.html - Aravind.HU
这是针对应用程序而非活动的。 - Georgi Dimitrov

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