绑定服务使用AIDL与绑定使用操作?

时间:2014-07-15 05:49:11

标签: android service ipc aidl

根据开发人员论坛上的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,它有Service类和AIDL接口。

我有应用程序B,我希望通过它来访问应用程序A的Service类,使用在应用程序A中暴露ny AIDL的方法。

所以我在应用程序B中为AIDL创建了完全相同的pacakge,并从App A粘贴了AIDL。

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

  

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

在App A服务中

  

导出="真&#34 ;.

现在我已经对这种方法感兴趣,我在应用A中为我的服务添加了Intent Filter,并尝试使用

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

现在它正在运作!

在推荐原始文档时,我错过了哪些内容?什么时候会使用?

1 个答案:

答案 0 :(得分:0)

在上述评论中与pskink讨论后,我得到了这个问题的答案。 anser在于我的新实现。

检查文档中上面示例中使用的Intent的构造函数。它告诉在Intent构造函数中传递的 IRemoteService.class.getName()只是一个' Action'。因此,如果我希望我的代码应该能够找到我想要绑定的服务,那么 IRemoteService.class.getName()返回的字符串应该被提及为我的服务的Action inside intent过滤器。

这里要考虑的两点是:

  1. 这不会遵循行动的标准命名惯例。

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