2011-08-31 102 views
14

我有一个后台服务,当内存不足时,它有时会被操作系统杀死。如何强制重启服务?

  1. 如何模拟此行为,以便我可以调试它?

开发者指南只是说“如果您的服务已启动,则必须设计,它优雅地处理由系统重新启动,如果系统杀死你的服务,它尽快重新启动它的资源再次可用”。

  1. 调用从被杀死到完成重启的时间顺序是怎样的?

在一个侧面(相关)问题上,当服务被操作系统杀死时,即在没有service.onDestroy被调用的情况下,服务中启动的主动运行的AsyncTask会发生什么?它是否继续运行或与服务一起悄悄地被撕掉?

回答

6

在新版本中,服务将具有以下事件触发:

onCreate() 

随后...

int onStartCommand(Intent intent, int flags, int startid) 

我知道在评论上述你提到使用,但它是值得重复:不要使用旧的“onStart()”事件。 onStartCommand是做事的新方式。

onCreate()可用于创建任何对象等,但在onStartCommand()中执行服务的实际代码。

使用onStartCommand()完成后,您应返回结果。使用“START_STICKY”告诉操作系统它可以重新启动,如果它需要杀死它。使用“START_NOT_STICKY”告诉操作系统在内存再次可用后不要试图重新启动它。这意味着您的应用程序需要再次手动启动服务。还有其他选项 - 检查API文档。

检查这些标记可以让你明白为什么你的服务已经开始 - 如果你的应用程序启动了它,或者如果操作系统启动它来重新启动它。您需要定期存储任何重要变量的状态,以便如果操作系统重新启动它,您可以检索这些变量 - 您可以使用SharedPreferences私有存储来存储这些变量。绝对将任何内容存储在onDestroy事件中,但不要指望被调用。

此外,建议您将startID字段存储在变量中,并在服务完成运行时将其与stopSelfResult(startId)结合使用。

请记住,如果您的服务被操作系统杀死,您可能没有机会存储任何变量。你需要能够看到你的状态是否是你期望的,当操作系统重新启动时,如果不是只是重置所有或优雅地死亡也许。

就调试而言,您是否考虑过编写另一个应用程序,该应用程序除了在活动中吸取内存以强制使用低内存条件?顶级活动应该优先考虑内存并强制服务死掉。

在服务推出

额外的线程仍然是相同的应用程序的一部分,所以他们将与服务一起被杀死(和应用程序的其余部分。)你可以通过添加内定期的日志报表验证这线程然后查杀服务。

其他可能对您有用的东西是检查您的服务是否已从您的应用程序中运行。这是一个这样做的功能:

// Determine if one of my services is currently running 
public static boolean isMyServiceRunning(Context context, String servicename) { 
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
     if (servicename.equals(service.service.getClassName())) { 
      return true; 
     } 
    } 
    return false; 
} 
+0

终止在DDMS (如yjw提到的)会给我重新启动的行为。并感谢您的详细解释。 –

+0

关于DDMS的好提示和解释没有问题。刚刚发生的事情是,我几乎遇到了编写条形码扫描应用程序的几乎相同的问题,该应用程序将所有工作作为服务完成,因此屏幕无需打开。 –

3

如果它是本地服务(默认),而不是远程服务,那么它与您的应用程序在相同的进程中运行。这意味着你可以通过杀死你的应用程序来仿效它。你可以在eclipse或者命令行中使用ddms,甚至从你的手机(设置 - >应用程序)使用ddms。

+1

我可以杀死但没有重新启动与它关联。 –

+0

检查您从Service的onStartCommand返回的值。我认为这是你想要的:http://developer.android.com/reference/android/app/Service.html#START_STICKY – Erdal

+0

是的,这就是我正在使用的。我的主要问题是,我不知道如何模拟Android杀 - 重启 - 服务行为。 –