【问题标题】:Difference between using a binder and onHandleIntent at IntentService classes在 IntentService 类中使用 binder 和 onHandleIntent 的区别
【发布时间】:2013-06-09 19:19:42
【问题描述】:

根据 Android APIIntentService 派生类会为每个接收到的意图创建一个新的工作线程,并将其传递给 onHandleIntent() 实现。

所以我假设(如果我错了,请纠正我)我的实现应该区分我想要接收的所有不同类型的意图,然后在我的服务中调用相应的方法来处理这个请求。这一切都将在工作线程中完成,该工作线程已在 onStartCommand() 方法中自动创建。

我的问题是,如果正在执行对仅封装了我的服务的公共方法(请参阅"Extending the Binder class" 部分)的活页夹的调用,这些方法是否也会在专用工作线程中执行?还是会在主应用程序的线程中完成?如果我想从主屏幕小部件调用方法,是否需要额外的 Messenger 来委派这些调用?

我什么时候使用哪种方法(BinderonStartCommand())?

【问题讨论】:

  • “一个 IntentService 派生类为每个接收到的意图创建一个新的工作线程,并将其传递给 onHandleIntent() 实现”——不,只有一个线程用于后台工作。它是一个独立于主应用程序线程的线程,但它不是每个命令一个。

标签: android android-service


【解决方案1】:

IntentService 不是为绑定目的而构建的。 current implementation 从其 onBind() 方法返回 null

此外,当前实现在单独的单线程上处理所有请求。 (服务启动时特别创建)。 Intent 消息只是在该线程的处理程序上排队。

如果您扩展IntentService,并简单地向客户端提供Binder,则绑定器的方法将在调用这些方法的同一线程上调用。

如果您实现自己的IBinder 扩展或使用Messenger 模式,将在您发起消息Handler 的线程上调用方法。

【讨论】:

  • 好的,让我说对了:只有一个单独的工作线程,通过意图处理所有请求。但是当我使用一个简单地提供服务方法的Binder时,它们将在调用者的线程中执行(?)
  • @Paweł 是的,请自己查看源代码here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
相关资源
最近更新 更多