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

来源:互联网 发布:linux和windows哪个好 编辑:程序博客网 时间:2024/06/06 12:44

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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在游戏平台充值没到账该怎么办 充值豪华黄钻没到账该怎么办 起点签到签满了怎么办 ipad锁屏声音小怎么办 扣扣邮箱文件超大了怎么办 网易邮箱图片已过期怎么办 邮箱里面的文件过期了怎么办 邮箱发的文件过期了怎么办 邮箱发送的文件过期怎么办 小米4s开不开机怎么办 小米平板关机后开不开机怎么办 公司老板跑路了社保怎么办 公司老板跑路社保怎么办 公司被公安局查封社保怎么办 小米四开不了机怎么办 小米的手机后壳裂了怎么办 公司没钱拖欠员工社保怎么办 小米note充不进去电怎么办 公司欠社保没交怎么办 公司不给转社保怎么办 小米note充电特别慢怎么办 小米小米note2充电慢怎么办 小米note充电红灯不闪烁怎么办 小米note充电红灯闪烁怎么办 小米note2突然充电慢怎么办 充电小米note2手机闪烁怎么办 小米6x上网慢怎么办 小米5数据上网慢怎么办 小米5c照相模糊怎么办 小米5充电很慢怎么办 iphone图库照片没了怎么办 我想通过微信号得到手机号怎么办 给充电宝充电慢怎么办 小米5s充不了电怎么办 百度网盘下载速度慢怎么办 负债累累没有钱没有资源怎么办 好福利密码忘了怎么办 手机无法申请百度网盘怎么办 魅族手机运行慢怎么办 阿里小宝卡流量用完了怎么办 阿里宝卡流量用完了怎么办