防止Android服务的多个副本

防止Android服务的多个副本,android,service,android-service,Android,Service,Android Service,for startService声明“如果此服务尚未运行,将实例化并启动它(如果需要,为其创建一个进程);如果它正在运行,则它将保持运行。” 我发现对startService的每次调用似乎都在启动一个独立的服务实例,因为服务正在做的工作(在我的测试用例中,只是简单地写入一个新的日志文件)在每次调用中都会再次执行。 我正在尝试通过ActivityManager循环检测服务。。。getRunningServices(Integer.MAX_VALUE)),但它没有显示。 SGS11上的Android

for startService声明“如果此服务尚未运行,将实例化并启动它(如果需要,为其创建一个进程);如果它正在运行,则它将保持运行。” 我发现对startService的每次调用似乎都在启动一个独立的服务实例,因为服务正在做的工作(在我的测试用例中,只是简单地写入一个新的日志文件)在每次调用中都会再次执行。 我正在尝试通过ActivityManager循环检测服务。。。getRunningServices(Integer.MAX_VALUE)),但它没有显示。 SGS11上的Android 2.3.3 我在这里遗漏了一些东西。我知道服务的onCreate()方法只有在创建时才会被调用,而且因为我在服务中有一个连续的进程(

在我的活动的onResume方法中,我启动服务(“myService”)的方法是:

在我的服务中,我有一个onCreate

@Override 

public void onCreate(){
    super.onCreate();
    ...
在这里,我使用TimerTask设置了一个计时器,它每秒写入一次日志文件

这正如预期的那样工作-我可以看到正在编写日志。 在活动的onResume方法中,在调用StartService方法之前,我将通过调用包含

for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
    if (service.service.getClassName().contentEquals("com.gpsanimator.startrax.myService")) {
    Toast.makeText(getApplicationContext(), "Service IS SO running: ", Toast.LENGTH_SHORT).show();
        return true;
}
这永远找不到myService服务,即使它似乎正在运行,因为它正在愉快地写入日志文件

每次我恢复我的活动时,myService服务的onCreate方法都会被调用——它会生成一个新的日志文件并开始写入其中,同时原始日志文件也会不断更新。 服务不是在第一次调用startService时启动的吗?然后继续运行吗?对startService()的后续调用不应该发现服务已经在运行,因此不会再次触发onCreate()方法吗?但这不是我看到的。似乎对startService()的每次调用都会触发服务的onCreate()方法


它显然比这更复杂,我想弄清它的底细。

这一切都取决于您将代码放入的方法

调用startService时,在给定时间内只会创建一个服务。如果该服务已存在,则会重复使用。因此,只有在服务不存在时才会调用()中的代码

但是,每次调用startService时,不管发生什么情况,()中的代码都将运行


因此,是的,在给定的时间内只有一个服务实例存在,但是调用startService可能会产生影响。

问题是我声明了myService类来扩展IntentService,而不是service!
一旦我解决了这个问题,它就按照书中所说的那样工作了!

您正在扩展IntentService,它将作为一个工作线程工作。该服务将根据需要启动,使用工作线程依次处理每个意图,并在用完工作线程时自动停止。因此在您的情况下,您的服务在完成任务后自动停止,因此它会创建多次。您应该使用服务类并与组件绑定。

IntentService立即(自动)停止工作完成后,如果重新启动,直到工作完成,将重用现有的服务实例,并且不会调用onCreate。因此,请小心使用IntentServices。

好的,谢谢,它变得更清楚了,但是我问题的第二部分仍然没有回答-为什么服务没有出现在getRunningServices中。@StarTraX可以吗共享一些代码?也许你正在停止该服务?即使该服务只能运行一次,而OnCreate只调用一次,Android希望你为长时间运行的代码创建一个单独的线程。因此,在极少数情况下,当你在OnCreate中调用
Task.run
时,当该服务停止并再次启动时,该任务可以运行两次kly。第一个OnCreate的线程尚未完成,而重启后对OnCreate的第二个调用将生成另一个线程。太好了。你能接受你自己的答案吗?这将帮助其他来此问题寻求建议的人。不要去阅读所有答案。正如下面提到的StartTrax,这是在他扩展“IntentService”而不是“Service”类。问题是我声明我的myService类是为了扩展IntentService,而不是Service!一旦我修复了它,它就按照书中的说明工作了!”
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
    if (service.service.getClassName().contentEquals("com.gpsanimator.startrax.myService")) {
    Toast.makeText(getApplicationContext(), "Service IS SO running: ", Toast.LENGTH_SHORT).show();
        return true;
}