Android AIDL 创建的DEMO

发布时间:2024年01月07日

使用AIDL创建一个demo 主要参考文件, 以及其他地址

Android 接口定义语言 (AIDL) ?|? Android 开发者 ?|? Android Developers?

绑定服务概览 ?|? Android 开发者 ?|? Android Developers

Android 接口定义语言 (AIDL)

Android 接口定义语言 (AIDL) 与您可能使用过的其他接口语言 (IDL) 类似。您可以利用它定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信。在 Android 中,一个进程通常无法访问另一个进程的内存。因此,为进行通信,进程需将其对象分解成可供操作系统理解的原语,并将其编组为可供您操作的对象。编写执行该编组操作的代码较为繁琐,因此 Android 会使用 AIDL 为您处理此问题。

注意:只有在需要不同应用的客户端通过 IPC 方式访问服务,并且希望在服务中进行多线程处理时,您才有必要使用 AIDL。如果您无需跨不同应用执行并发 IPC,则应通过实现 Binder 来创建接口;或者,如果您想执行 IPC,但需要处理多线程,请使用 Messenger?来实现接口。无论如何,在实现 AIDL 之前,请您务必理解绑定服务

上面是官网对AIDL的描述,下面说了使用AIDL创建一个简单的dmeo

1 选中自己包名

2 点击鼠标右键 之后选择new ,之后再选择AIDL 在点击AIDL File

之后自己取一个名字点击finish

3 之后android studio 会自动生成一个AIDL包如下, 下面文件是自己刚才文件的,报名时工具生成

一般里面默认有一个方法,自己有添加了几个,1个void 和2个有返回值的方法,具体如下

// Declare any non-default types here with import statements

interface Information {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);

    // 自己定义的几个方法
    void Infor(String name ,int age);

    boolean isActive();

    List<String> getList();

}

4 之后再点击工具栏上的Build

5 选择里面的Make Project

之后自己在app下面的build里面查看生成的文件,如果文件生成了,就可以接着下面的工作了

下面图是 Make Project 生成的

AIDL文件生成之后下面写代码

创建一个Service

public class InforService extends Service {

    private final IBinder iBinder = new Information.Stub() {
        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
            Log.d("******InforService", "Received data: " + anInt + ", " + aLong + ", " + aBoolean + ", " + aFloat + ", " + aDouble + ", " + aString);
        }

        @Override
        public void Infor(String name, int age) throws RemoteException {
            Log.d("******infor", "姓名=" + name + "," + "年龄=" + age);
        }

        @Override
        public boolean isActive() throws RemoteException {
            return true;
        }

        @Override
        public List<String> getList() throws RemoteException {
            return Arrays.asList("A", "B", "C", "D");
        }
    };

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d("******Bind service:", String.valueOf(intent));
        return iBinder;
    }
}

之后再AndroidManifest 文件里面注册下刚才创建的服务

            <service
            android:name="com.hly.aidldemo.InforService"
            android:enabled="true"
            android:exported="true" />

最后在Main里面使用ServiceConnection来获取AIDL连接成功和失败的方法

在连接成功的方法里面使用asInterface获取AIDL里面的方法

下面是自己放2个void方法里面传递一些参数,然后获取2个有返回值的方法,如下

public class MainActivity extends ComponentActivity {

    private final ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Information information = Information.Stub.asInterface(service);
            try {
                //传递参数
                information.basicTypes(18,18L,true,18.88f,18.88,"HI");
                information.Infor("张三丰",180);
                //获取参数
                Log.d("******isActive", String.valueOf(information.isActive()));
                Log.d("******getList", String.valueOf(information.getList()));
            } catch (RemoteException e) {
                throw new RuntimeException(e);
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d("******onServiceDisconnected,","onServiceDisconnected:"+name);
        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity_layout);

        Intent intent = new Intent(this,InforService.class);
        bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
    }
}

这样一个简答的AIDLdemo 流程就创建完成了。

demo 地址,上传到码云上了,点击可以下载看看

文章来源:https://blog.csdn.net/qq_33210042/article/details/135439019
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。