AIDL开发注意事项

开发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/

Server:
https://github.com/ITAnt/AIDL-Server/

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ithouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值