防止Android服务的多个副本

Sta*_*raX 17 service android android-service

startService 的doco声明"如果此服务尚未运行,它将被实例化并启动(如果需要,为它创建一个进程);如果它正在运行,那么它仍然在运行." 我发现每次调用startService似乎都是启动一个单独的服务实例,因为服务正在进行的工作(在我的测试用例中,通常写入新的日志文件)正在为每次调用再次完成.我试图通过循环ActivityManager来检测服务... getRunningServices(Integer.MAX_VALUE))但它没有显示出来.SGS 11上的Android 2.3.3我在这里遗漏了一些东西.我知道Service的onCreate()方法只有在创建时才被调用,而且因为我在服务中运行了一个连续的进程(

在我的Activity的onResume方法中,我正在启动服务("myService"):

    Intent intent = new Intent(this, myService.class);
startService(intent);
Run Code Online (Sandbox Code Playgroud)

在MyService中,我有一个onCreate之类的

@Override 

public void onCreate(){
    super.onCreate();
    ...
Run Code Online (Sandbox Code Playgroud)

从我设置定时器的地方,使用TimerTask,它一次/秒写入日志文件.

这按预期工作 - 我可以看到正在编写的日志.在Activity的onResume方法中,在调用StartService方法之前,我通过调用包含checkForRunningService方法检查myService服务是否存在

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;
}
Run Code Online (Sandbox Code Playgroud)

这永远不会找到myService服务,即使它似乎正在运行,因为它很乐意写入日志文件.

每次恢复我的Activity时,我的myService服务的onCreate方法被调用 - 它生成一个新的日志文件并开始写入它以及不断更新的原始日志文件.第一次调用startService时服务是否启动?然后继续跑?后续调用startService()是否应该发现服务已经运行,因此不会再次触发onCreate()方法?但那不是我所看到的.似乎每次调用startService()都会触发Service的onCreate()方法.

这显然比这更复杂,我想深究它.

yyd*_*ydl 33

这一切都取决于你将代码放入哪种方法.

当您调用startService时,将只在给定时间创建一个服务.如果该服务已存在,则将重复使用.因此,只有在服务尚不存在的情况下才会调用onCreate()中的代码.

但是,每次调用startService时,无论如何都会运行onStartCommand()中的代码.

所以,在给定时间只有一个服务实例存在,但调用startService会产生影响.


Sta*_*raX 11

问题是我已经声明我的myService类扩展了IntentService,而不是Service!一旦我解决了这个问题,这一切都按照本书的规定运作!