【问题标题】:Opening the camera in a different process在不同的过程中打开相机
【发布时间】:2016-05-22 11:48:01
【问题描述】:

我的一个应用在某些Kitkat Samsung 设备中存在严重的活动娱乐问题。该问题在拍照时出现的频率更高,并且在 RAM 一半的糟糕Jellybean Samsungs 中没有观察到。日志显示内存不足,但没有抛出 OutOfMemoryExceptions。我认为Kitkat 中有更激进的活动关闭政策(否则默认的相机应用程序会泄漏)。

我想知道操作系统是在我的应用程序的内存很高时关闭我的活动,还是在所有应用程序使用的总内存很高时关闭它们。如果操作系统有每个进程的阈值,那么在不同的进程中打开相机可能会有所帮助。

我知道可以使用清单中的process 属性在自己的进程中启动服务。假设Activities 不存在等效属性,如果我在其自己的进程中启动代理服务,然后从该服务启动一个活动,该活动是否也会在该进程中运行?

【问题讨论】:

  • @Onik 好吧,那些段落是背景。也许那里有人对操作系统内存管理有深入的了解,可以帮助我了解正在发生的事情。我已经知道 Lollipop 内存泄漏问题以及 webview 泄漏,但 AFAIK 这些不适用于具有更新 webviews 的 Kitkats。
  • Activity也可以在自己的进程中启动developer.android.com/guide/topics/manifest/…
  • 如果您通过 Intent 使用相机,您已经在单独的进程中使用相机。启动的相机应用程序可能由用户选择,它可能很大,将您的进程挤出内存。您的应用应该准备好成为 Android 系统中的好公民,保持退出状态,并在返回 Intent 结果时恢复状态。但是,如果您的用例不能接受这种破坏,您必须在应用程序中实现“自定义相机”。操作这样的相机并不是一项固有的内存密集型任务。

标签: android memory process camera android-lifecycle


【解决方案1】:

所描述的行为与Application fundamentals 文档完全一致,从该文档中很明显“在不同的进程中打开相机”对您没有帮助,因为这已经发生了默认情况下:

当系统启动一个组件时,它会启动该应用程序的进程(如果它尚未运行)并实例化该组件所需的类。例如,如果您的应用在相机应用中启动捕获照片的 Activity,则该 Activity 在属于相机应用的进程中运行,而不是在您的应用的进程中。

因此,当相机应用程序被带到前台时,您的应用程序会进入后台,这使得它成为根据Processes and Application Life Cycle 在内存不足时被系统杀死的候选者之一。您正在目睹正常操作系统的行为。 RAM 总量不是关键点。可用于前台进程的可用内存量。

话虽如此,您的问题的答案是。任何Activity 在最初通过清单文件声明的应用程序(进程)中启动和运行,无论启动请求来自哪个进程。

命令

adb shell ps | grep 'app_name'

会告诉您您的相机应用程序正在哪些进程上运行。

虽然两个应用程序可以在同一个进程中运行,但必要的先决条件是应用程序的签名相同...来自Application fundamentals

可以安排两个应用共享同一个 Linux 用户 ID...具有相同用户 ID 的应用也可以安排在同一个 Linux 进程中运行并共享同一个虚拟机(应用还必须使用相同的证书)。

【讨论】:

  • 根据this developer guide,也可以使用android:process进行活动。
  • 正确。虽然您可以在您的应用程序中使用该属性,但您无法为相机应用程序更改它,因此无论您设置什么 process 值,相机应用程序 Activity 都将在不同的进程中运行(使用如果该属性未在清单中设置,则为默认名称)。
  • 我明白了。不过,它可能对基于 SurfaceHolder 的内部相机活动很有用。
  • Activity 娱乐没有什么“坏”的。这就是操作系统的行为方式。如果它杀死了在后台的进程,它会在该进程即将再次被带到前台时恢复它。开发人员的目的是处理正确的Activity/Service 状态保存/恢复,以便让用户看起来应用从未被杀死。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
相关资源
最近更新 更多