定义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)