Android中AIDL异常

在调试AIDL服务的时候,一开始遇到了下面这个问题:

 java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.example.renkai.aidl_test.IMyService }
看过很多大神的回答,说是Android 5.0之后AIDL就不支持隐式声明了,总结了网上的方法,大致有两种,一种是通过Intent的setAction和setPackage方法来声明Service服务;另一种是在实例化Intent的时候就传入需要的服务类。这里主要讲第一种方法,客户端代码如下:

Intent intent = new Intent();
intent.setAction("com.example.renkai.aidl_test.IMyService");
intent.setPackage("com.example.renkai.aidl_test");
startService(intent);
bindService(intent,serviceConnection,
          Context.BIND_AUTO_CREATE);
通过setAction方法将服务端传入,注意这里的参数都是你自己在Service中定义的Action和Service的包名,如下:
<service android:name=".MyService" >
    <intent-filter>
         <action android:name="com.example.renkai.aidl_test.IMyService"/>
    </intent-filter>
</service>
这样就可以解决上述的异常了(原以为就这样结束了,天真的我眼泪掉下来 大哭),在调用服务端的方法时,却又出现了错误:

java.lang.SecurityException: Binder invocation to an incorrect interface
解决方法就是,保证两端的AIDL接口一致,必须是完全一致,即包名和文件名均一致,所以我就直接将服务端的AIDL下的文件夹copy到了客户端的AIDL文件夹下,重建到一半,出现了一大堆问题啊,最后在客户端直接创建一个和服务端文件名完全一样的文件夹,最终解决问题。

1.服务端


2.客户端



扫描二维码关注公众号,回复: 8680211 查看本文章
发布了72 篇原创文章 · 获赞 42 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/xiaoxun2802/article/details/72847426