如何使用服务中运行的线程优雅地关闭android服务

时间:2013-10-24 14:11:33

标签: android android-intent service android-activity message

情况:

注意:这是前一个问题的后续工作,该问题涉及如何在活动/服务之间设置处理程序/消息通信。请参阅:link

Activity使用绑定连接到已启动的服务。 Activity获取一个本地绑定器,其中包含对服务处理程序的引用。活动和服务通过每个处理程序交换消息对象。当用户完成App时,用户向Service发出信号以退出已启动的服务(关闭服务)。在服务(= mainThread)内运行另一个线程serviceThread。 serviceThread能够运行更多的subthreads,完全由serviceThread控制。在activity和serviceThread之间处理通信,而不是通过服务的mainThread !!!

问题:

如果在服务内部有多个线程无休止地运行,我如何优雅地关闭服务(直到我发出一条消息说:“收拾行李,回家!”,又名:EXIT_SERVICE。

解决方案候选人:

  • 场景1:从活动方面,向服务中运行的serviceThread发送EXIT_SERVICE消息(而不是mainThread!)。当serviceThread的所有子线程都被清理/停止时,向活动发送一条消息,指示现在可以安全地调用实际停止服务的stopService(Intent)方法。该活动现在可以调用finish()并正常退出应用程序。

  • 场景2:从活动方面,向serviceThread发送EXIT_SERVICE消息,该消息将清除所有子线程。完成此操作后,serviceThread会向活动发送一条消息,表明该服务将完全关闭,并在发送该消息后,向服务的mainThread处理程序发送一条消息,以实际关闭该服务。该服务接收shutdown-message并清除变量并调用stopSelf(int)。 服务停止,活动知道它也可以停止,没有调用stopService(Intent)!该应用程序正常退出。

  • 场景3:从活动方面调用stopService(Intent)方法,该方法将Intent传递给服务以停止服务。在服务中,在执行停止服务的实际服务代码之前,拦截了Intent(我不知道这是否可行以及如何执行此操作......但假设可以这样做)。在服务实际停止之前,首先执行其他代码,通过向serviceThread发送EXIT_SERVICE消息来清除线程。在serviceThread清理完之后,它会将消息发送回mainThread(服务本身),并且代码继续执行正常代码,该代码通常在停止服务的Intent未被拦截时执行。该应用程序正常退出。

因此,我有三个选项可以优雅地停止服务。问题是哪种情况是“最好的”(更少出错,最快关闭,最容易实现)。例如:当活动被销毁时会发生什么,因为用户在“停止服务”消息或意图被发送时切换了纵向/横向模式?

我认为场景3是一个很好的解决方案,因为它不需要在活动方面进行大量额外编码,只需要stopService(Intent)和finish()。当GUI已经消失时,该服务也可以处于停止状态。唯一的问题是如何拦截停止意图并对该信号采取行动。

请分享你的想法......

0 个答案:

没有答案