Android 5.0及更高系统使用AIDL的问题

如果你是刚刚使用AIDL的新手, 一定发现在网上找到的其他关于AIDL的资料都是基于较早平台下的(Android 5.0以前). 其代码在更高平台会出现一个比较麻烦的问题, 我花费了好长时间才弄清楚解决方案, 在此分享给大家希望能帮助新手少走弯路.

下面我以http://blog.csdn.net/cjjky/article/details/7562652中的代码举例, 如果你恰好也在Android 5.0(或更高平台)使用了这篇文章的代码,那一定也会遇到和我一样的问题.

0. 所用平台:

System: Android 5.0
IDE: Android Studio

1. 部署代码

按照那篇文章说明,将服务端和客户端的代码写好并部署到Android平台上, 点击”查询”时, 客户端程序崩溃.

2. 发现错误

查看错误原因:

Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.andyidea.aidl.bookservice }

于是定位到AIDLClientDemoActivity.java文件的35,36行:

Intent service = new Intent("com.andyidea.aidl.bookservice");  
bindService(service, bookConn, BIND_AUTO_CREATE);  

3. 原因分析

http://blog.csdn.net/vrix/article/details/45289207这篇文章把原因说得非常清楚:

有些时候我们使用Service的时需要采用隐私启动的方式,但是Android 5.0一出来后,其中有个特性就是Service Intent  must be explitict,也就是说从Lollipop开始,service服务必须采用显示方式启动。

4. 实验

我在Android 4.4平台下试验了相同的代码, 发现可以正常运行了, 虽然有一个警告:

Implicit intents with startService are not safe

说明的确是Android 5.0的问题.

5. 解决方案

有两个解决方案:

(1)换成Android 5.0以下的系统

这个不必多说了, 刚刚试验过并且成功了的.

(2)加一段代码

只需要在intent后加这样一段代码即可:

intent.setPackage("com.andyidea.aidl");

即把intent所在的包清楚地设置好, 这样就变得explicit了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值