【问题标题】:binding Service using AIDL vs binding using action?使用 AIDL 绑定服务与使用操作绑定?
【发布时间】:2014-07-15 05:49:11
【问题描述】:

根据开发者论坛上的documentaion,这就是我可以使用 AIDL 绑定我的服务的方式:

/* Establish a couple connections with the service, binding by interface names.This allows  other  applications to be installed that replace the remote service by implementingthe same  interface.*/

bindService(new Intent(IRemoteService.class.getName()),mConnection, Context.BIND_AUTO_CREATE);

现在我有了应用程序 A,它有服务类和 AIDL 接口。

我有应用程序 B,我希望通过它访问应用程序 A 的服务类,使用在应用程序 A 中公开的 AIDL 方法。

所以我在应用 B 中为 AIDL 创建了完全相同的包,并粘贴了来自应用 A 的 AIDL。

但是当我尝试使用文档中提到的上述机制绑定服务时,它告诉我:

无法启动服务 Intent { act com.example.service.MyService } U=0:未找到

在应用 A 服务中

导出=“真”。

现在采用这种方法,我在应用程序 A 中将 Intent Filter 添加到我的服务中,并尝试使用

指定显式意图
intent.setClassName(String packageName, String className)

现在它开始工作了!

那么在参考原始文档时我是否遗漏了什么?什么时候会使用这个方法?

【问题讨论】:

  • IRemoteService.class.getName() 返回什么?你是如何在清单中定义你的服务的?
  • 请参考我的问题开头的链接,该链接指的是Android文档。 developer.android.com/guide/components/aidl.html#Calling
  • 你没有回答,你是如何在清单中声明你的服务的?
  • 所以添加一个具有唯一操作 e 的意图过滤器。 G。 "com.example.service.MyService.ACTION_START" 并将该字符串传递给 Intent 构造函数

标签: android service ipc aidl


【解决方案1】:

在上面的 cmets 中与 pskink 讨论后,我得到了这个问题的答案。分析器在于我的新实现。

检查文档中上述示例中使用的Intent 的构造函数。它告诉在 Intent 构造函数中传递的 IRemoteService.class.getName() 只不过是一个“动作”。因此,如果我希望我的代码应该能够找到我希望绑定的服务,那么应该将 IRemoteService.class.getName() 返回的字符串作为我的服务的意图过滤器内的操作提及。

这里要考虑的两点是:

  1. 这不会遵循操作的标准命名约定。

  2. 使用隐式 Intent 启动服务会产生警告,因为使用 startService 的隐式 Intent 不安全,原因很明显,如果多个服务使用相同的 Action,则会出现问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-29
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    相关资源
    最近更新 更多