情况:
注意:这是上一个问题的后续,该问题负责如何设置活动/服务之间的处理程序/消息通信。见:链接
Activity 使用绑定连接到已启动的服务。Activity 获取一个本地绑定器,并返回一个对服务处理程序的引用。Activity 和 Service 通过彼此的 Handler 交换 Message 对象。当用户使用完 App 后,用户向 Service 发出信号以退出已启动的 Service(关闭服务)。在服务 (=mainThread) 中,另一个线程正在运行,即 serviceThread。serviceThread 能够运行更多的子线程,完全由 serviceThread 控制。通信是在activity和serviceThread之间处理的,而不是通过service的mainThread!!!
问题:
当服务内部的多个线程无休止地运行时,我如何优雅地关闭服务(直到我发出一条消息说:“收拾好你的背,回家!”,又名:EXIT_SERVICE.
解决方案候选:
场景 1:从 Activity 端,向服务中运行的 serviceThread(不是 mainThread!)发送 EXIT_SERVICE 消息。当 serviceThread 的所有子线程都被清理/停止时,向活动发送一条消息,指示现在可以安全地调用实际停止服务的 stopService(Intent) 方法。Activity 现在可以调用 finish() 并且应用程序正常退出。
场景 2:从 Activity 端,向 serviceThread 发送 EXIT_SERVICE 消息,该消息将清理所有子线程。完成后,serviceThread 向要完全关闭服务的活动发送一条消息,并在发送该消息后,向服务的 mainThread 处理程序发送一条消息以实际关闭服务。该服务接收关闭消息并清理变量并调用 stopSelf(int)。服务已停止,并且活动知道它也可以停止,而无需调用 stopService(Intent)!应用程序优雅地退出。
场景三:从activity端调用stopService(Intent)方法,将Intent传递给服务,停止服务。在服务中,这个 Intent 在停止服务的实际服务代码被执行之前被拦截(我不知道这是否可能以及如何做到这一点......但假设可以这样做)。在服务实际停止之前,首先执行其他代码,通过向 serviceThread 发送 EXIT_SERVICE 消息来清理线程。在 serviceThread 清理完毕后,它会向 mainThread(服务本身)发送一条消息,并且代码会继续执行在没有拦截到停止服务的 Intent 时正常执行的正常代码。应用程序优雅地退出。
所以,关于如何优雅地停止服务,我有三个选项。问题是哪种方案是“最好的”(更不容易出错,关闭速度最快,最容易实现)。例如:当 Activity 被销毁时会发生什么,因为用户在发送“停止服务”消息或 Intent 的那一刻切换了纵向/横向模式?
我认为场景 3 是一个不错的解决方案,因为它在活动方面不需要很多额外的编码,只需要 stopService(Intent) 和 finish()。当 GUI 已经消失时,该服务也可能正在停止。唯一的问题是如何拦截停止意图并根据该信号采取行动。
请分享你的想法......