防止Android服务的多个副本

时间:2012-03-02 03:53:40

标签: android service 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);

在MyService中,我有一个onCreate,如

@Override 

public void onCreate(){
    super.onCreate();
    ...

我使用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;
}

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

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

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

4 个答案:

答案 0 :(得分:31)

这完全取决于您将代码放入哪种方法。

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

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

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

答案 1 :(得分:10)

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

答案 2 :(得分:1)

IntentService在执行工作后立即(自动)停止,但如果再次启动它直到工作完成,则重用现有服务实例并且不会调用onCreate。所以请小心使用IntentServices。

答案 3 :(得分:0)

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