如果你是刚刚使用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了.