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
- Android 5.0及更高系统使用AIDL的问题
- AIDL的简单使用,涵盖5.0之后系统及魅族手机调用问题的解决
- android aidl的使用
- Android AIDL的使用
- android AIDL的使用
- Android AIDL的使用
- Android AIDL的使用
- Android Aidl的使用
- android aidl的使用
- android AIDL的使用
- Android-AIDL的使用
- Android 源码编译AIDL 使用实例讲解及Android Studio AIDL的调用详解
- Android 跨进程通信Aidl的使用及注意事项
- Android AIDL 双向调用的使用及相关原理
- Android 跨进程通信Aidl的使用及注意事项
- Android中AIDL使用 及 AIDL实现进程间的通信
- android studio的AIDL问题
- AIDL通信 android 在5.0以使用隐式Intent方式来启动Service的问题
- erlang中的spawn函数
- 111
- 增强型MonkeyRunner 脚本计划
- Longest Common Prefix
- NowCoder猜想
- Android 5.0及更高系统使用AIDL的问题
- 跨平台CMake的编写
- Hadoop Ls命令增加显示条数限制参数
- Java NIO 系列教程
- 人脉是如何积聚的
- C++ 大规模程序设计 之 包
- 12c可插拔 数据库CDB与pdb管理总结
- 设计模式:转载Head First设计模式读书笔记
- 最短路之单源最短路