ACTION_IMAGE_CAPTURE意图:避免活动被破坏/进程被终止



此问题适用于熟悉活动生命周期的Android开发人员。

我正在开发一款可以进行人脸检测和面部地标识别的应用程序。

根据机器学习模型需要很长时间才能从SD存储器中解析并加载到存储器中。在目前的安卓设备上,这很容易需要20秒。顺便说一句,所有这些人脸分析和模型加载都发生在C++本地代码中,该代码使用Android NDK+JNI集成。

因为模型加载需要很长时间,所以实际的解析和加载是通过AsyncTasks在后台提前安排的,这样用户就不会注意到巨大的延迟。

在进行实际人脸分析之前,用户可以通过MediaStore.ACTION_IMAGE_CAPTURE自拍。这将调用设备上安装的单独相机应用程序,并通过onActivityResult接收图片。

现在问题开始了:当用户在单独的相机活动/应用程序中时,几乎总是会杀死整个应用程序进程大多数情况下,这似乎发生在从相机应用程序返回之前(时间似乎很奇怪)。我做了另一个测试来确认当按下camer应用程序内的捕获按钮时会发生这种情况。在那一刻,我的应用程序被杀了。按下"接受图像"按钮时,将重新创建应用程序。ActivityManager在logcat中给出的进程终止的原因是"prev LAST"(我通过谷歌没有发现这一点的含义,但我看到许多其他应用程序也因这个原因而终止,所以这种情况似乎经常发生)。

因此,我的应用程序的所有活动都需要由Android重新创建(我觉得很好,因为它发生得很快),但人脸分析模型也必须从头开始重新加载,用户会注意到在处理他的自拍之前会出现巨大的延迟

我的问题是:有没有可能告诉安卓,一个活动/应用程序有正当理由在后台临时获取相机照片时不被杀死毕竟,ActivityManager杀死应用程序的决定是错误的。必须如此频繁地重新加载模型会占用大量的CPU和内存资源。

这似乎是安卓生命周期架构中的一个疏忽。我知道很少有应用程序有我的应用程序的特定要求,但这似乎很愚蠢。我能想到的"解决"这个问题的唯一方法是在应用程序中实现我自己的相机活动,但这与安卓自己的最佳实践背道而驰。

还有一些"android:spersistent"标志,你可以通过AndroidManifest.xml坚持你的活动,但文档完全不清楚这一点的含义。请参阅相关文档。

顺便说一句:当应用程序进程被终止时,不会调用onDestroy。我在某个地方读到,不能保证onDestroy会被调用,这对我来说实际上不是问题。尽管我想知道为什么Android文档没有明确说明这一点。

当用户在单独的相机活动/app 中时,几乎总是会杀死整个应用程序进程

这并不奇怪。相机应用程序可能会消耗相当多的内存,因此Android需要通过终止后台应用程序的进程来释放内存。

毕竟,ActivityManager做出了杀死应用的错误决定

考虑到可能的替代方案是操作系统崩溃,我怀疑用户会同意操作系统终止进程的决定。

必须如此频繁地重新加载模型,这占用了大量的CPU和内存资源。

那么也许你不应该从你的应用程序启动另一个应用程序。自己拍照。直接使用相机API,或者使用Fotoapparat和CameraKit Android等库作为这些API的简单包装器。

我能想到的"解决"这个问题的唯一方法是在应用程序中实现我自己的相机活动,但这与Android自己的最佳实践背道而驰。

根据这一论点,任何设备都不会有摄像头应用程序,因为编写任何摄像头应用程序"都与安卓自己的最佳实践背道而驰"。

需要相机的任何应用程序都必须使用相机API(直接或间接)来拍摄可靠的行为。你假设成千上万的相机应用程序都写得很好,并且会正确地遵守你的ACTION_IMAGE_CAPTUREIntent(例如,将结果放在你用EXTRA_OUTPUT指定的位置)。许多相机应用程序都有错误的ACTION_IMAGE_CAPTURE实现。对于你和用户可以在没有拍照的情况下生活的情况(例如,具有"附加照片"功能的笔记应用程序),ACTION_IMAGE_CAPTURE并非没有道理,但你的应用程序似乎并非如此。

最新更新