ACTION_IMAGE_CAPTURE 意图:避免 Activity 被销毁/进程被杀死
ACTION_IMAGE_CAPTURE intent: Avoid Activity being destroyed / process being killed
这个问题是针对 Android 熟悉 Activity 生命周期 的开发人员的。
我正在开发一款执行人脸检测和面部特征识别的应用程序。
相应的机器学习模型需要很长时间才能从 SD 存储中解析并加载到内存中。在目前的平均 Android 设备上,它很容易需要长达 20 秒的时间。顺便说一句,所有这些人脸分析和模型加载都发生在 C++ 本机代码中,它是使用 Android NDK + JNI 集成的。
由于模型加载耗时较长,实际的解析和加载通过AsyncTasks提前安排在后台,这样用户不会注意到巨大的延迟。
在执行实际面部分析之前,用户可以通过MediaStore.ACTION_IMAGE_CAPTURE自拍。这将调用安装在设备上的单独相机应用程序并通过 onActivityResult.
接收图片
现在问题开始了:当用户在单独的摄像头中时,几乎总是会终止整个应用进程 Activity/App。 大多数情况下,它似乎发生在之前从相机应用程序返回(时间似乎很奇怪)。我做了另一项测试以确认当在相机应用程序中按下捕获按钮时会发生这种情况。在那一刻,我的应用程序被杀死了。当按下 'Accept image' 按钮时,将重新创建应用程序。 ActivityManager 在 logcat 中给出的终止进程的原因是 'prev LAST' (我通过 Google 没有发现任何关于这个的含义,但我看到了很多其他应用也因为这个原因被杀死,所以它似乎经常发生)。
因此,我的应用程序的所有 Activity 都需要由 Android 重新创建(对我来说很好,因为它发生得很快),而且还必须重新加载面部分析模型从头开始,用户会注意到在处理他的自拍之前有一个巨大的延迟。
我的问题是:是否有可能告诉 Android 一个 Activity/App 有正当理由在暂时处于后台获取相机时不被杀死picture? 毕竟,ActivityManager 做出了终止该应用程序的错误决定。必须如此频繁地重新加载模型会占用大量 CPU 和内存资源。
这似乎是对 Android 生命周期架构的疏忽。我知道很少有应用程序有我的应用程序的特定要求,但仍然看起来很愚蠢。我能想到的 'fix' 这个问题的唯一方法是在应用程序中实现我自己的相机 Activity,但这与 Android 自己的最佳实践背道而驰。
还有一些 'android:persistent' 标志,您可以通过 AndroidManifest.xml 坚持您的 Activity,但文档完全不清楚其含义。 See the docs on this.
顺便说一句:当应用程序进程被杀死时,不会调用onDestroy。我在某处读到,不能保证会调用 onDestroy,这对我来说实际上不是问题。虽然我想知道为什么 Android 文档没有明确说明这一点。
Almost always the whole app process will be killed while the user is in the separate camera Activity/App
这并不奇怪。相机应用程序会消耗大量内存,因此 Android 需要通过终止后台应用程序的进程来释放内存。
After all, the ActivityManager makes a wrong decision to kill the app
鉴于可能的替代方案是 OS 崩溃,我怀疑用户会同意 OS 终止您的进程的决定。
Having to reload the models so frequently takes up a lot of CPU and memory resources.
那么也许您不应该从您的应用程序启动另一个应用程序。自己拍照。直接使用相机 API,或使用 Fotoapparat 和 CameraKit-Android 等库作为这些 API 的简单包装器。
The only way I can think of to 'fix' this issue is to implement my own camera Activity inside the app, but this goes counter Android's own best practices.
根据该论点,任何设备都不会拥有相机应用程序,就像编写任何相机应用程序一样 "goes counter Android's own best practices"。
任何需要摄像头的应用程序必须使用摄像头API(直接或间接)以获得可靠的行为。您假设数以千计的相机应用程序都已正确编写,并且会正确地遵守您的 ACTION_IMAGE_CAPTURE
Intent
(例如,将结果放在您用 EXTRA_OUTPUT
指定的位置)。 Many camera apps have buggy ACTION_IMAGE_CAPTURE
implementations。 ACTION_IMAGE_CAPTURE
对于您和用户可以在没有拍照的情况下生活的情况(例如,具有 "attach photo" 功能的笔记应用程序)并非不合理,但情况似乎并非如此使用您的应用程序。
这个问题是针对 Android 熟悉 Activity 生命周期 的开发人员的。
我正在开发一款执行人脸检测和面部特征识别的应用程序。
相应的机器学习模型需要很长时间才能从 SD 存储中解析并加载到内存中。在目前的平均 Android 设备上,它很容易需要长达 20 秒的时间。顺便说一句,所有这些人脸分析和模型加载都发生在 C++ 本机代码中,它是使用 Android NDK + JNI 集成的。
由于模型加载耗时较长,实际的解析和加载通过AsyncTasks提前安排在后台,这样用户不会注意到巨大的延迟。
在执行实际面部分析之前,用户可以通过MediaStore.ACTION_IMAGE_CAPTURE自拍。这将调用安装在设备上的单独相机应用程序并通过 onActivityResult.
接收图片现在问题开始了:当用户在单独的摄像头中时,几乎总是会终止整个应用进程 Activity/App。 大多数情况下,它似乎发生在之前从相机应用程序返回(时间似乎很奇怪)。我做了另一项测试以确认当在相机应用程序中按下捕获按钮时会发生这种情况。在那一刻,我的应用程序被杀死了。当按下 'Accept image' 按钮时,将重新创建应用程序。 ActivityManager 在 logcat 中给出的终止进程的原因是 'prev LAST' (我通过 Google 没有发现任何关于这个的含义,但我看到了很多其他应用也因为这个原因被杀死,所以它似乎经常发生)。
因此,我的应用程序的所有 Activity 都需要由 Android 重新创建(对我来说很好,因为它发生得很快),而且还必须重新加载面部分析模型从头开始,用户会注意到在处理他的自拍之前有一个巨大的延迟。
我的问题是:是否有可能告诉 Android 一个 Activity/App 有正当理由在暂时处于后台获取相机时不被杀死picture? 毕竟,ActivityManager 做出了终止该应用程序的错误决定。必须如此频繁地重新加载模型会占用大量 CPU 和内存资源。
这似乎是对 Android 生命周期架构的疏忽。我知道很少有应用程序有我的应用程序的特定要求,但仍然看起来很愚蠢。我能想到的 'fix' 这个问题的唯一方法是在应用程序中实现我自己的相机 Activity,但这与 Android 自己的最佳实践背道而驰。
还有一些 'android:persistent' 标志,您可以通过 AndroidManifest.xml 坚持您的 Activity,但文档完全不清楚其含义。 See the docs on this.
顺便说一句:当应用程序进程被杀死时,不会调用onDestroy。我在某处读到,不能保证会调用 onDestroy,这对我来说实际上不是问题。虽然我想知道为什么 Android 文档没有明确说明这一点。
Almost always the whole app process will be killed while the user is in the separate camera Activity/App
这并不奇怪。相机应用程序会消耗大量内存,因此 Android 需要通过终止后台应用程序的进程来释放内存。
After all, the ActivityManager makes a wrong decision to kill the app
鉴于可能的替代方案是 OS 崩溃,我怀疑用户会同意 OS 终止您的进程的决定。
Having to reload the models so frequently takes up a lot of CPU and memory resources.
那么也许您不应该从您的应用程序启动另一个应用程序。自己拍照。直接使用相机 API,或使用 Fotoapparat 和 CameraKit-Android 等库作为这些 API 的简单包装器。
The only way I can think of to 'fix' this issue is to implement my own camera Activity inside the app, but this goes counter Android's own best practices.
根据该论点,任何设备都不会拥有相机应用程序,就像编写任何相机应用程序一样 "goes counter Android's own best practices"。
任何需要摄像头的应用程序必须使用摄像头API(直接或间接)以获得可靠的行为。您假设数以千计的相机应用程序都已正确编写,并且会正确地遵守您的 ACTION_IMAGE_CAPTURE
Intent
(例如,将结果放在您用 EXTRA_OUTPUT
指定的位置)。 Many camera apps have buggy ACTION_IMAGE_CAPTURE
implementations。 ACTION_IMAGE_CAPTURE
对于您和用户可以在没有拍照的情况下生活的情况(例如,具有 "attach photo" 功能的笔记应用程序)并非不合理,但情况似乎并非如此使用您的应用程序。