我从活动(活动 A)创建了一个服务(服务 B)。从服务 B,我创建了另一个服务(服务 C)。以前,服务 C 曾经是线程而不是服务。由于从长远来看它存在问题,我将其更改为服务。服务 C 运行一个带有 3 秒 Thread.sleep 调用的 while 循环。但一般情况下它不会停止。日志显示服务正在运行。但用户界面被阻止,几分钟后系统询问我是否关闭。
如何使此服务非阻塞调用?
我从活动(活动 A)创建了一个服务(服务 B)。从服务 B,我创建了另一个服务(服务 C)。以前,服务 C 曾经是线程而不是服务。由于从长远来看它存在问题,我将其更改为服务。服务 C 运行一个带有 3 秒 Thread.sleep 调用的 while 循环。但一般情况下它不会停止。日志显示服务正在运行。但用户界面被阻止,几分钟后系统询问我是否关闭。
如何使此服务非阻塞调用?
来自 Android 中的服务文档
服务不是一个单独的进程。Service 对象本身并不意味着它在自己的进程中运行;除非另有说明,否则它在与其所属的应用程序相同的进程中运行。
服务不是线程。它本身并不是一种脱离主线程工作的方法(以避免应用程序无响应错误)。
在这种情况下,最好的方法是启动一个新线程,然后从那里调用一个服务。
是的,从文档中可以清楚地看出,服务不是单独的进程。相反,请按照以下方式使其工作:
因此,如果您从服务中使用覆盖 onCreate 方法,它将检查服务是否已经在运行,如果它没有运行,它将启动服务。否则它将跳过并且不会启动另一个服务。
我认为服务 C 正在主线程上运行,尝试创建另一个线程(新线程或异步任务)
服务总是在主线程上运行。您需要在 Service C 中生成后台线程或重复运行TimerTask
等,以避免阻塞 UI 线程。