定义和使用AIDL接口

定义和使用AIDL接口

2024-07-27
编程开发

定义AIDL接口

使用场景:在library/module中定义AIDL,打包成sdk,再给其他APP调用

第一步,新建一个module,取名为sdk,在main目录下新建AIDL文件

编辑器报错,无法创建,我们需要在build.gradle文件设置一下,内容如下:

添加之后再sync一下,然后就可以创建AIDL文件了,AIDL文件长下面这个样子

文件名以.aidl结尾,里面的内容跟我们平时写java接口一样

默认情况下,数据类型只支持Java基本类型以及String(其他数据类型后面再作介绍)。

先试着定义一个接口say()

// IMyAidlInterface.aidl
package com.example.aidlserviceexample;

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

interface IMyAidlInterface {
    /**
     * 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);

    String say(String text);
}

最后将整个项目build一下,系统会自动帮我们生成一个IMyAidlInterface.Stub类,这个类在后面写接口实现类的时候需要用到

实现AIDL接口

AIDL接口的实现需要结合Service组件

class MyService : Service() {

    // IMyAidlInterface.Stub类是build自动生成的
    private val mBinder = object : IMyAidlInterface.Stub() {
        override fun basicTypes(
            anInt: Int,
            aLong: Long,
            aBoolean: Boolean,
            aFloat: Float,
            aDouble: Double,
            aString: String?
        ) {
            // do nothing
        }

        override fun say(text: String?): String {
            println(text)
            return "invoke success param=${text}"
        }
    }

    override fun onBind(intent: Intent): IBinder {
        return mBinder
    }
}

使用AIDL接口

server端,在Manifest中注册Service,比如:

<service
    android:name="com.example.sdk.MyService"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.sdk" />
    </intent-filter>
</service>

client端,先引入jar包,然后通过显示intent或隐式intent来调用aidl接口

第一步:生成jar包

然后引入jar包

调用AIDL接口

val intent = Intent(this, MyService::class.java)
bindService(intent, object : ServiceConnection {
    override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
        val interfac = IMyAidlInterface.Stub.asInterface(service)
        interfac.say("hello")
    }

    override fun onServiceDisconnected(name: ComponentName?) {
        TODO("Not yet implemented")
    }
}, BIND_AUTO_CREATE)
THE END
0/500
暂无评论
📢网站公告
欢迎来到这里
本站推荐:腾讯云服务器仅需2.3折 (点击直达)
用户协议
隐私政策