AIDL使用

来源:互联网 发布:c语言实验报告怎么写 编辑:程序博客网 时间:2024/06/06 09:43
AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言。

支持这些基本数据类型byte、short、int、long、float、double、boolean、char、String、CharSequence,如果使用其他数据类型,则需要定义(本文不做介绍)。

适用情况:主要用于调用远程服务的方法的情况。

AIDL是跨进程通信,可以说是两个不同应用间的通信,下面分为两个部分来做介绍。


实现端(服务端):
1、在android studio中任意一路径下,右键根据模板新建一个aidl文件(如图)

,AS会自动在aidl目录下新建一个相同路径的aidl文件,添加接口方法:

package com.example.droidplugindemo;interface LoginAidl {    String getUsername();}
2、编译项目,在build/generated/source/aidl/debug目录下会生成一个跟上述aidl文件同路径、同名的java文件(这个文件我们不用管,但其实就是它在起作用)
3、新建一个service,和AIDL的实现类,在onBind的时候,返回实现类实例:
public class LoginService extends Service {    @Nullable    @Override    public IBinder onBind(Intent intent) {        return new LoginServiceImpl();    }    private class LoginServiceImpl extends LoginAidl.Stub {        @Override        public String getUsername() throws RemoteException {            return "qq";        }    }}
4、在AndroidManifest.xml文件中定义service:
<service android:name=".LoginService">    <intent-filter>        <action android:name="com.example.test.login" />    </intent-filter></service>
       
请求端(客户端):
1、新建一个同路径、同名的aidl文件
2、绑定service:
Intent intent = new Intent("com.example.test.login");bindService(intent, conn, Context.BIND_AUTO_CREATE);
3、连接service成功后获取返回值:
private LoginAidl loginAidl;private ServiceConnection conn = new ServiceConnection() {    @Override    public void onServiceConnected(ComponentName name, IBinder service) {        loginAidl = LoginAidl.Stub.asInterface(service);        Log.e("test", "onServiceConnected");        try {            Log.e("test", loginAidl.getUsername());        } catch (RemoteException e) {            e.printStackTrace();        }    }    @Override    public void onServiceDisconnected(ComponentName name) {        Log.e("test", "onServiceDisconnected");    }};

使用感受

感觉使用起来较为繁琐,用广播也可以实现跨进程通信,使用起来却是简单很多,存在既有必要,详见Android跨进程通信之AIDL机制和广播机制的异同


参考:

Android:学习AIDL,这一篇文章就够了(上)

AIDL介绍和实例讲解

Android IPC的6种方式

0 0
原创粉丝点击