在较新的版本下,服务将触发以下事件:
onCreate()
接着……
int onStartCommand(Intent intent, int flags, int startid)
我知道您在上面提到的 cmets 中提到了使用它,但值得重复:不要使用旧的“onStart()”事件。 onStartCommand 是一种新的做事方式。
onCreate() 可用于创建任何对象等,但在 onStartCommand() 中执行服务的实际代码。
使用 onStartCommand() 完成后,您应该返回一个结果。使用“START_STICKY”告诉操作系统如果需要杀死它可以重新启动。使用“START_NOT_STICKY”告诉操作系统不要在内存再次可用后尝试重新启动它。这意味着您的应用程序需要再次手动启动服务。还有其他选项 - 查看 API 文档。
检查这些标志可以让您了解服务启动的原因 - 是您自己的应用启动了它,还是操作系统启动了它以重新启动它。您需要定期存储任何重要变量的状态,以便如果操作系统重新启动它,您可以检索这些变量 - 您可能可以使用 SharedPreferences 私有存储来存储这些变量。绝对将任何内容存储在 onDestroy 事件中,但不要指望它会被调用。
另外,建议您将 startID 字段存储在一个变量中,并在您的服务完成运行时将其与 stopSelfResult(startId) 一起使用。
请记住,如果您的服务被操作系统杀死,您可能没有机会存储任何变量。您需要能够查看您的状态是否在您重新启动时的预期状态操作系统,如果不只是重置所有内容,或者优雅地死掉。
就调试而言,您是否考虑过编写另一个应用程序,该应用程序除了在 Activity 中吸内存之外什么都不做,以强制出现内存不足的情况?顶级活动应该优先考虑内存并强制服务终止。
服务中启动的其他线程仍然是同一应用程序进程的一部分,因此它们将与服务(以及应用程序的其余部分)一起被杀死。您可以通过添加常规来验证这一点在线程中记录语句,然后终止服务。
其他可能对您有用的方法是检查您的服务是否已经在您的应用程序内部运行。这是一个函数:
// 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;
}