rob*_*ert 2 android android-ndk application-lifecycle activity-lifecycle android-camera-intent
这个问题是针对熟悉Activity Lifecycle 的Android 开发人员的。
我正在开发一个执行面部检测和面部标志识别的应用程序。
相应的机器学习模型需要很长时间才能从 SD 存储中解析并加载到内存中。在当前的平均 Android 设备上,很容易需要长达 20 秒的时间。顺便说一句,所有这些面部分析内容和模型加载都发生在 C++ 本机代码中,并使用 Android NDK + JNI 进行集成。
由于模型加载需要很长时间,因此实际的解析和加载是通过 AsyncTasks 提前安排在后台的,因此用户不会注意到巨大的延迟。
在执行实际的人脸分析之前,用户可以通过 MediaStore.ACTION_IMAGE_CAPTURE 进行自拍。这将调用设备上安装的单独相机应用程序并通过 onActivityResult 接收图片。
现在问题开始了:当用户位于单独的相机活动/应用程序中时,几乎总是整个应用程序进程都会被终止。大多数情况下,它似乎发生在从相机应用程序返回之前(时间似乎很奇怪)。我做了另一个测试,以确认在相机应用程序内按下拍摄按钮时会发生这种情况。在那一刻,我的应用程序被杀死了。当按下“接受图像”按钮时,将重新创建应用程序。ActivityManager 在 logcat 中给出的进程终止原因是“prev LAST”(我通过 Google 没有找到任何关于此含义的信息,但我看到许多其他应用程序也因这个原因被终止,所以它似乎发生了经常)。
因此,我的应用程序的所有 Activity 都需要由 Android 重新创建(对我来说很好,因为它发生得很快),而且面部分析模型也必须从头开始重新加载,用户会注意到在自拍之前有巨大的延迟可以进行处理。
我的问题是:是否有可能告诉Android,活动/应用程序有合法的理由在暂时处于后台获取相机图片时不被杀死?毕竟,ActivityManager 做出了终止应用程序的错误决定。如此频繁地重新加载模型会占用大量的 CPU 和内存资源。
这似乎是 Android 生命周期架构中的一个疏忽。我知道很少有应用程序有我的应用程序的特定要求,但它仍然看起来很愚蠢。我能想到的“解决”这个问题的唯一方法是在应用程序中实现我自己的相机 Activity,但这违背了 Android 自己的最佳实践。
还有一些“android:persistent”标志,您可以通过 AndroidManifest.xml 坚持您的 Activity,但文档完全不清楚其含义。请参阅有关此的文档。
顺便说一句:当应用程序进程被杀死时,onDestroy 不会被调用。我在某处读到不能保证 onDestroy 会被调用,这对我来说实际上不是问题。虽然我想知道为什么 Android 文档没有明确说明这一点。
当用户位于单独的相机 Activity/App 中时,几乎总是会杀死整个应用程序进程
这并不奇怪。相机应用程序可能会消耗大量内存,因此 Android 需要通过终止后台应用程序进程来释放内存。
毕竟,ActivityManager 做出了杀死应用程序的错误决定
鉴于可能的替代方案是操作系统崩溃,我怀疑用户会同意操作系统终止进程的决定。
如此频繁地重新加载模型会占用大量的 CPU 和内存资源。
那么也许您不应该从您的应用程序启动另一个应用程序。自己拍张照片。直接使用相机 API,或者使用 Fotoapparat 和 CameraKit-Android 等库作为这些 API 的更简单的包装器。
我能想到的“解决”这个问题的唯一方法是在应用程序中实现我自己的相机 Activity,但这违背了 Android 自己的最佳实践。
按照这个论点,任何设备都不会拥有相机应用程序,因为编写任何相机应用程序“都违背了 Android 自己的最佳实践”。
任何需要相机的应用程序都必须使用相机 API(直接或间接)才能获得可靠的行为。您假设数以千计的相机应用程序都已正确编写并且将正确地尊重您的要求ACTION_IMAGE_CAPTURE Intent(例如,将结果放在您指定的位置EXTRA_OUTPUT)。许多相机应用程序都有错误的ACTION_IMAGE_CAPTURE实现。ACTION_IMAGE_CAPTURE对于您和用户可以在不拍摄照片的情况下生活的情况(例如,具有“附加照片”功能的笔记应用程序)来说,这并非不合理,但您的应用程序似乎并非如此。
| 归档时间: |
|
| 查看次数: |
1060 次 |
| 最近记录: |