在调试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 查看本文章