您的位置:首页 > 大数据 > 人工智能

关于AIDL客户端与服务端交互的包名问题-package

2016-05-10 17:46 218 查看

今天在做一个有关AIDL的例子的时候,遇到一个小问题,死活两个进程就是无法通信。按着书上的例子做的(此处代码出自疯狂Android讲义第2版),还是出错,最后在网上查了下才知道是包名的问题。也就是说自己定义的那个AIDL接口所在的包的包名必须保持客户端和服务器端一致。否则会报错,程序强制退出。错误信息如下(事物绑定失败):

在调试模式下会看到如下异常(目标调用异常)抛出:

之所以这样是因为我的包名不一致,如下:

                             

两者所在的包不一样,这是因为自己当时是直接复制的那个ICat.aidl文件,内容为:

package com.qc.aidlservice;
interface ICat
{
String getColor();
double getWeight();
}

因为其中涉及到导包,因为直接复制到服务端会报错,所以在服务端的文件中我把需要导入的包名改成了如下的包:

package com.example.myaidlclientdemo;
interface ICat
{
String getColor();
double getWeight();
}

但是这样就会出现上面所说的错误,其实这样多此一举反而造成了错误。最简单的做法就是在编写完服务器端代码后直接将AIDL文件所在的包原封不动的复制到我们的客户端。系统会自动为我们生成.java文件,简单方便。如下:

                                           

最后需要注意的就是配置service的时候,千万不能把service的属性配置成android:exported="false",此例中为:

<service android:name=".AidlService"
android:exported="false">
<intent-filter >
<action android:name="com.example.myaidldemo.action.AIDL_SERVICE"/>
</intent-filter>
</service>

这样配置外部应用当然无法访问了啊(犯该错误的原因是在解决上篇博文里的警告问题是忘记改过来了,所以程序就一直强推,所以一定要细心细心再细心!!!)。

应该配置为:

<service android:name=".AidlService"
android:process=":remote">
<intent-filter >
<action android:name="com.example.myaidldemo.action.AIDL_SERVICE"/>
</intent-filter>
</service>

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: