android - 防止 Android 服务的多个副本

标签 android service android-service

doco对于 startService 状态“如果此服务尚未运行,它将被实例化并启动(如果需要为它创建一个进程);如果它正在运行,那么它仍然在运行。” 我发现每次对 startService 的调用似乎都在启动服务的一个 separate 实例,因为该服务正在执行的工作(在我的测试用例中,简单地写入一个新的日志文件)每次通话都会再次完成。 我试图通过循环来检测服务 ActivityManager... getRunningServices(Integer.MAX_VALUE)) 但它没有出现。 SGS 11 上的 Android 2.3.3 我在这里遗漏了一些东西。我知道服务的 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 服务,即使它似乎正在运行,因为它正在愉快地写入日志文件。

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

显然比这更复杂,我想深入了解它。

最佳答案

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

当您调用 startService 时,在给定时间只会创建一项服务。如果服务已经存在,它将被重用。所以 onCreate 中的代码() 只有在服务不存在时才会被调用。

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

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

关于android - 防止 Android 服务的多个副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9527728/

相关文章:

java - 如何删除 nullPointerException

php - 如何让PHP和IOS Iphone加密通话?

android - 改造给出 java.lang.VerifyError

python - 如何在 Ubuntu 中查看 systemd 服务日志

android - Android 服务可以提供两个接口(interface)进行通信吗?

安卓机房 : How to model relationships?

android - 带计时器的 embarcadero delphi XE10 android 服务

Android:我应该使用什么来运行后台长期 Activity ?

java - IntentService 中未调用 OnHandleIntent()

android - 当应用程序在 android 中处于后台时继续播放流式音频