开发AIDL并不难,但繁琐的步骤和细节,如果稍不注意,就容易“入坑”,本博客主要介绍AIDL的相关注意事项,在最后会附上AIDL的实例项目,包括客户端和服务端供大家下载参考。需要注意的地方有:
1.在Android Studio里开发AIDL很方便,我们先开发Service端。新建一个项目之后,直接File –> New –> Folder –> AIDL Folder,就会在项目出现一个aidl文件夹,然后右键点击aidl文件夹,New –> Package –> 在该package里新建各种.aidl文件和.java文件。我们之所以把所有和aidl相关的文件(包括.aidl和.java)放在这个package下,是为了方便拷贝到Client端。
(1) 自定义的类型(.java)需要有一个对应的(.aidl)文件,比如我要自定义一个Book.java,那么在aidl下的package里new 一个class,加上成员变量name,generate相应的getter和setter,并增加一个午餐构造函数
public Book() {}
接着implements Parcelable,然后alt + enter,让AndroidStudio自动为我们重写关键代码。
(2)新建相应的aidl文件,比如上面我们新建了Book.java,接着我们要新建Book.aidl
package com.itant.aidl;
//这个文件的作用是引入了一个序列化对象 Book 供其他的AIDL文件使用
//注意:Book.aidl与Book.java的包名应当是一样的
//注意parcelable是小写
parcelable Book;
(3)新建接口文件IEasyLink.aidl
package com.itant.aidl;
// 一定要显式导入!!!!!!!!!!!!!!
import com.itant.aidl.Book;
interface IEasyLink {
void testEasyLinkAIDL(String text);
void anotherMethod(String text, in Book book);
}
2.AIDL接口文件不可以定义重载方法,这是一个大坑,即不能定义两个方法名相同的方法,即使参数个数、类型不一致也不行,切记!
3.在服务端编写好Service代码之后,记得在服务端的清单文件里注册Service,写上Action:
<service android:name="com.itant.aidl_server.EasyService">
<intent-filter>
<action android:name="com.ithouse.aidl"/>
</intent-filter>
</service>
4.要在build.gradle(Module:app)里的android{}节点里增加:
sourceSets {
main {
java.srcDirs = ['src/main/java','src/main/aidl']
aidl.srcDirs = ['src/main/aidl']
}
}
否则会报找不到aidl的错误,编译将无法通过。
5.直接到磁盘里找到Service的aidl文件夹,把他复制到Client项目的目录下(直接放到磁盘里,不用在AndroidStudio里new了,和java文件夹同级),在Client端同样要执行步骤4,否则编译也无法通过。
6.注意安卓5.0以上版本不能直接bindService:
http://blog.csdn.net/vrix/article/details/45289207
我在我的Nubia手机安卓6.0测试还没通过,尝试了在service配置里设置exported还是不行,估计是和部分定制手机的阻止关联启动有关,暂时没有很好的解决办法,参考:
http://blog.csdn.net/u011748648/article/details/52129618
先startService,再bindService也不行:
http://blog.csdn.net/harryweasley/article/details/52993614
如果有同学倒腾出来了还望告知一声。
而一个折中的做法是:先在client端启动server端的一个Activity(android:exported=”true”),并且该Activity里启动目标Service,然后再在client端执行bindService操作即可。不过,这样做的话,要妥善处理好弹出来的界面,否则会很突兀。
可以设置透明主题:
<style name="TransparentTheme">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
</style>
7.注意Server端的方法运行在Server端的Binder线程池中,本身就可以执行大量耗时操作,这个时候千万不要在Server端方法中开线程去执行异步任务。此时要注意避免Client界面卡顿即可。
参考:
http://blog.csdn.net/wuyuxing24/article/details/46948961
项目下载:
Client:
https://github.com/ITAnt/AIDL-Client/