Aidl系列

本文主要介绍了在使用Aidl过程中遇到的空指针异常问题及其解决方法,包括服务端的aidl文件创建、服务配置,以及客户端的模块创建和路径匹配。作者分享了自己的调试经验,提醒在manifest.xml中配置服务时需设置android:exported="true",并指出源码已上传至码云。
  • 关于Aidl系列文章,网上已经是有不少优秀的博文,我自己也参考着网上的一些优秀博文写一些Demo,但是运行的时候经常会遇到空指针异常,为此是不停地摸索,去解决。现在我把自己踩过的一些坑写出来,希望能帮助到后面的人少走点弯路。
  • 下面是一些我个人觉得比较不错的参考文章(如果作者觉得我侵权,我会马上关闭):
    叶应是叶 Android AIDL使用详解
    任玉刚 Android Binder机制浅析
首先先创建service端。
![这里写图片描述](https://img-blog.youkuaiyun.com/20180206151210697?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSGVsbG9fbGps/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

- 在这里可以使用studio新建命令来快速创建aidl文件。记得aidl目录是在main目录下。


创建addNumber接口
- 创建addNumber接口

package com.briskemen.service;

interface AddNumber {
   int add(int a,int b);
}
  • 必须得编译一下,如果你可以在下图的目录下看到编译生成的aidl文件,说明编译成功。
    编译生成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项目.
    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里面调用:
    调用aidl
  • 见证奇迹的时候到了。
    输出结果

下面我来说一个我之前调试无数次出现空指针的问题

报空指针

  • 报错详情
 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源码,我放在了码云。源码传送门

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值