android进程间通信-AIDL

本文着重介绍Android中AIDL实现进程间通信的方法。总体分三步:创建AIDL,需注意包名导入问题;创建服务端,要在onBind方法中判断访问权限等;创建客户端,通过特定方法获取Binder对象。按此操作可实现AIDL功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android进程间通信可以参考android-进程间通信

这里着重介绍一下AIDL。

这里只是记录一下我自己的实现过程,例子本身不重要,重要的是知道怎么做。。。

总体来说分三步:创建AIDL,创建服务端,创建客户端。

一、创建AIDL

1.在java目录下创建一个包名com.ps.sevenaidldemo.aidl随便取),然后创建Book.java实体类,这个实体类必须实现Parcelable接口,用于序列化和反序列化

 

2.新建aidl文件夹,跟java同级别,然后在这个文件夹下创建跟实体类同名的aidl文件及其他aidl接口文件。

3.Rebuild项目,生成Binder的java接口文件。

我在Rebuild时,出现如下错误:

Process 'command ' C:\Users\ps\AppData\Local\Android\Sdk\build-tools\28.0.3\aidl.exe'' finished with non-zero exit value 1

 

 

这是因为导入的包名不对。

将包名改为:package com.ps.sevenaidldemo.aidl;

相应的,IBookManager.aidl,和 OnNewBookAddListener.aidl中也需要将包名改正确。

另外,IBookManager.aidl 和 OnNewBookAddListener.aidl中用到了Book类,虽然在同一包下,但是还是需要导入,这里只能手动导入。

 

确保需要的包全部导入正确,然后就可以Rebuild通过了,这样就生成了Binder的java接口文件。

 

 

二、创建服务端(Service)

创建Service,在onBind方法中返回Binder实例对象,并实现aidl接口方法。

 

服务端是Service的典型实现,以上需要注意的点:

在onBind方法中,最好添加访问权限的判断,防止一些恶意的访问,可使用 Permission 验证,在 manifest 中声明。

创建Binder 对象时,不能使用new Binder ()的方式,必须使用new IBookManager.Stub()创建Binder对象,这是AIDL接口文件自动生成的Binder对象。

 

服务是四大组件之一,需要在清单文件中注册

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ps.sevenaidldemo">

    <!--自定义访问Service的权限-->
    <permission android:name="com.ps.sevenaidldemo.aidl.permission.LOCAL"/>
    <!--声明本拥有该权限-->
    <uses-permission android:name="com.ps.sevenaidldemo.aidl.permission.LOCAL"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service
            android:name=".aidl.BookManagerService"
            android:enabled="true"
            android:exported="true"
            android:process=":remote"
            android:permission="com.ps.sevenaidldemo.aidl.permission.LOCAL">
        </service>

    </application>

</manifest>

 

三、创建客户端

绑定远程服务后,通过ServiceConnection得到代理对象Binder,同时将Binder对象转换成AIDL接口,然后通过AIDL接口去调用服务端的方法。

注意:

  1. 在得到代理对象Binder时,不能直接使用强转的方式,否则会报类型转换异常,必须使用IBookManager.Stub.asInterface()得到AIDl接口文件生成的Binder对象。
  2. 需要得到一个AIDL实例对象时,应使用.Stub()方法得到。

通过以上操作就可以实现AIDL功能了,运行后结果如下:

 

2019-03-21 16:33:21.853 11024-11024/com.ps.sevenaidldemo E/MainActivity: 连接服务成功

2019-03-21 16:33:23.854 11024-11037/com.ps.sevenaidldemo E/MainActivity: onNewBookAdd: Book{bookName='新书1'}

2019-03-21 16:33:25.858 11024-11038/com.ps.sevenaidldemo E/MainActivity: onNewBookAdd: Book{bookName='新书2'}

2019-03-21 16:33:27.858 11024-11037/com.ps.sevenaidldemo E/MainActivity: onNewBookAdd: Book{bookName='新书3'}

2019-03-21 16:33:29.859 11024-11038/com.ps.sevenaidldemo E/MainActivity: onNewBookAdd: Book{bookName='新书4'}

2019-03-21 16:33:31.860 11024-11037/com.ps.sevenaidldemo E/MainActivity: onNewBookAdd: Book{bookName='新书5'}

2019-03-21 16:33:31.864 11024-11038/com.ps.sevenaidldemo E/MainActivity: onAllBook: [Book{bookName='遮天'}, Book{bookName='斗破苍穹'}, Book{bookName='坏蛋是怎样炼成的'}, Book{bookName='新书1'}, Book{bookName='新书2'}, Book{bookName='新书3'}, Book{bookName='新书4'}, Book{bookName='新书5'}]

 

通过以上三步操作,就实现了AIDL。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值