如果我与服务交互的方式是单向的(即只调用服务做某事而不询问结果)。这两种方法有什么区别:
startService(intent)
并onStartCommand
做任务取决于intent.getAction
- 绑定服务并使用 . 向服务发送消息
Messenger
。以便该服务根据消息执行任务。
这是我能想到的一个区别(我不确定):
对于方法1,我们每次调用都需要创建服务startService
,所以重载是我们需要每次都创建服务,除非使用START_STICKY
。
有几个不同之处,但最重要的是线程管理。
IntentService 如果您使用 Intent 服务,onHandleIntent 会在单个守护线程中调用。对 startService 的每个新调用都将显示为对 onHandleIntent 的有序、排队调用。结果是在该守护线程上简单、行为良好、按顺序执行调用。顺便说一句,在队列为空之前,服务不会自行停止:无需“重新创建”
同一个 App 中的绑定服务 实际上,绑定服务有两种情况。如果它在您的进程中运行,则该服务将在 UI 线程上运行。如果您需要从UI 线程运行的东西,您将必须构建自己的线程(可能是 Looper),因此,使用 Messenger 与它交谈。结果更灵活(线程数、排队顺序等由您决定)但与 IntentService 非常相似。
另一个应用程序 中的绑定服务 如果绑定服务属于不同的应用程序,您对它的调用将在多个 Binder 线程之一上运行。您不需要管理这些线程,它们由框架提供。但是,他们可以乱序执行您的调用。