- 关于Aidl系列文章,网上已经是有不少优秀的博文,我自己也参考着网上的一些优秀博文写一些Demo,但是运行的时候经常会遇到空指针异常,为此是不停地摸索,去解决。现在我把自己踩过的一些坑写出来,希望能帮助到后面的人少走点弯路。
- 下面是一些我个人觉得比较不错的参考文章(如果作者觉得我侵权,我会马上关闭):
叶应是叶 Android AIDL使用详解
任玉刚 Android Binder机制浅析
首先先创建service端。

- 在这里可以使用studio新建命令来快速创建aidl文件。记得aidl目录是在main目录下。
- 创建addNumber接口
package com.briskemen.service;
interface AddNumber {
int add(int a,int b);
}
- 必须得编译一下,如果你可以在下图的目录下看到编译生成的aidl文件,说明编译成功。
- 好啦,到了这一步,相信你们已经把服务端的aidl创建完毕了,下面让我们来创建服务
public AddNumberService() {
}
@Override
public IBinder onBind(Intent intent) {
return mStub;
}
private AddNumber.Stub mStub = new AddNumber.Stub() {
@Override
public int add(int a, int b) throws RemoteException {
return a+b;
}
};
注意,在manifest.xml配置该服务的时候必须带上android:exported=”true”属性,否则,跨进程是无法访问到你的服务。
<service
android:name=".AddNumberService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.briskemen.service.action"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
客户端。
- 新建一个项目,可以通过new module,创建一个Client项目.
这里需要注意的就是,aidl路径必须与服务端的路径一致,否则运行会报错. - 接下来,我会通过一个Button,来使用aidl。先给大家看一下布局文件,特别的简单.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.briskemen.client.Main2Activity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="addNumber"
android:text="通过aidl进行加法运算" />
</android.support.constraint.ConstraintLayout>
- 再看一下Activity里面调用:
- 见证奇迹的时候到了。
下面我来说一个我之前调试无数次出现空指针的问题
- 报错详情
Caused by: java.lang.NullPointerException:
Attempt to invoke interface method 'int com.briskemen.service.AddNumber.add(int, int)' on a null object reference
至于为什么会报错,我本人也没有太清楚,也许是尚未把AddNumber服务绑定完成就调用,导致出现空指针异常吧。如果有人知道原因,希望不吝赐教。
本次博文的demo源码,我放在了码云。源码传送门
本文主要介绍了在使用Aidl过程中遇到的空指针异常问题及其解决方法,包括服务端的aidl文件创建、服务配置,以及客户端的模块创建和路径匹配。作者分享了自己的调试经验,提醒在manifest.xml中配置服务时需设置android:exported="true",并指出源码已上传至码云。
362

被折叠的 条评论
为什么被折叠?



