绑定到远程服务时的Android应用程序生命周期

时间:2012-10-03 00:47:01

标签: android android-service android-lifecycle

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

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

1 个答案:

答案 0 :(得分:1)

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

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

流程生命周期

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

  1. 前景活动(用户当前正在与之交互的屏幕顶部的活动)被认为是最重要的。如果它使用的内存多于设备上可用的内存,那么它的过程只会作为最后的手段被杀死。通常此时设备已达到内存分页状态,因此需要这样才能保持用户界面的响应。
  2. 可见活动(用户可见但不在前台的活动,例如坐在前景对话框后面的活动)被认为非常重要,除非需要,否则不会被杀死保持前台活动正常运行。
  3. 后台活动(用户无法看到且已暂停的活动)不再重要,因此系统可能会安全地终止其进程以回收其他前景或可见进程的内存。如果需要杀死它的进程,当用户导航回活动(再次在屏幕上显示)时,将使用之前在onSaveInstanceState(Bundle)中提供的savedInstanceState调用其onCreate(Bundle)方法,以便它可以在用户上次离开的状态下重启自己。
  4. 空进程是不承载任何活动或其他应用程序组件(例如Service或BroadcastReceiver类)的进程。当内存变低时,系统会很快杀死它们。因此,您必须在活动BroadcastReceiver或Service的上下文中执行您在活动之外执行的任何后台操作,以确保系统知道它需要保持您的流程。
  5. 有时,Activity可能需要执行独立于活动生命周期本身存在的长时间运行操作。示例可以是允许您将图片上载到网站的相机应用程序。上传可能需要很长时间,应用程序应该允许用户离开正在执行的应用程序。要完成此操作,您的活动应启动上传发生的服务。这允许系统在上载期间正确地确定您的流程的优先级(考虑到它比其他非可见应用程序更重要),而与原始活动是暂停,停止还是完成无关。