gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:18:14 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com