1

我有一个 android 应用程序,一旦应用程序启动,它就会将自己绑定到远程服务。远程服务为蓝牙摄像机提供了抽象,因此我们可以轻松地发送命令和接收事件。绑定发生在Application自身而不是Activity. 对我来说重要的是,只要相机与蓝牙的连接处于活动状态,我的应用程序就会保持运行,这样我就可以从远程服务接收事件。主要原因是我需要知道它是否正在录制,如果是,我需要定期发送 GPS 坐标。

如果我在自己的应用程序中使用服务来管理它,我的应用程序是否有更好的机会不被杀死?或者我的应用程序是否安全,因为它仍然绑定到远程服务?当然,我知道如果内存要求需要,android 系统会杀死我的应用程序,但它会仅仅因为它已经坐了一段时间没有做太多而杀死我的应用程序吗?

4

1 回答 1

2

仅当内存不足时才应删除应用程序的进程,但如果您使用服务而不是空进程或后台活动,则会提高进程的感知重要性。您还可以使用 startForeground() 来降低 Android 停止服务的可能性。

来自http://developer.android.com/reference/android/app/Activity.html#ProcessLifecycle

流程生命周期

Android 系统尝试尽可能长时间地保留应用程序进程,但最终需要在内存不足时删除旧进程。如活动生命周期中所述,关于删除哪个进程的决定与用户与其交互的状态密切相关。通常,根据其中运行的活动,流程可以处于四种状态,此处按重要性顺序列出。系统会在杀死更重要的进程(第一个)之前杀死不太重要的进程(最后一个)。

  1. 前台活动(用户当前正在与之交互的屏幕顶部的活动)被认为是最重要的。如果它使用的内存比设备上的可用内存多,它的进程只会作为最后的手段被杀死。通常此时设备已达到内存分页状态,因此需要这样做以保持用户界面响应。
  2. 可见活动(对用户可见但不在前台的活动,例如坐在前台对话框后面的活动)被认为非常重要,除非需要保持前台活动运行,否则不会被杀死。
  3. 后台活动(对用户不可见且已暂停的活动)不再至关重要,因此系统可以安全地终止其进程以回收其他前台或可见进程的内存。如果它的进程需要被杀死,当用户导航回活动(使其再次在屏幕上可见)时,将使用它之前在 onSaveInstanceState(Bundle) 中提供的 savedInstanceState 调用它的 onCreate(Bundle) 方法,以便它可以在与用户上次离开时​​相同的状态下重新启动。
  4. 一个空进程是一个不承载任何活动或其他应用程序组件(例如服务或广播接收器类)的进程。当内存变低时,它们会很快被系统杀死。因此,您在活动之外执行的任何后台操作都必须在活动广播接收器或服务的上下文中执行,以确保系统知道它需要保留您的进程。

有时 Activity 可能需要执行独立于 Activity 生命周期本身而存在的长时间运行的操作。一个示例可能是允许您将图片上传到网站的相机应用程序。上传可能需要很长时间,并且应用程序应该允许用户离开正在执行的应用程序。为此,您的 Activity 应该启动一个进行上传的服务。这允许系统在上传期间正确地优先处理您的进程(认为它比其他不可见的应用程序更重要),而与原始活动是暂停、停止还是完成无关。

于 2013-01-14T23:40:33.323 回答