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/