概述
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:UserspsAppDataLocalAndroidSdkbuild-tools28.0.3aidl.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接口去调用服务端的方法。
注意:
- 在得到代理对象Binder时,不能直接使用强转的方式,否则会报类型转换异常,必须使用IBookManager.Stub.asInterface()得到AIDl接口文件生成的Binder对象。
- 需要得到一个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。
最后
以上就是谨慎云朵为你收集整理的android进程间通信-AIDLProcess 'command ' C:\Users\ps\AppData\Local\Android\Sdk\build-tools\28.0.3\aidl.exe'' finished with non-zero exit value 1的全部内容,希望文章能够帮你解决android进程间通信-AIDLProcess 'command ' C:\Users\ps\AppData\Local\Android\Sdk\build-tools\28.0.3\aidl.exe'' finished with non-zero exit value 1所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复