android - 在 IntentService 类中使用 Binder 和 onHandleIntent 的区别

标签 android android-service

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

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

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

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

最佳答案

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

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

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

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

关于android - 在 IntentService 类中使用 Binder 和 onHandleIntent 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17008932/

相关文章:

android - 应用程序没有响应 - Delphi XE6 - Android

android - 我们如何从可下载的字体创建字体?

android - IntentService 中的 registerReceiver 未命中 BroadcastReceiver

android - 即使我使用了 START_NOT_STICKY,为什么当进程被终止时我的 Android 服务会重新启动?

android - Android MVVM 中的服务和 ViewModel——它们如何交互?

android - 可以在服务中使用 LiveData 对象吗?

java - 如何为 Android 制作 Wake On Lan?

java - Android smoothScrollToPosition 无法正常工作

android - 将字符串值从另一个 java 类获取到 textview

java - Android:服务完成任务后如何启用按钮?