面试题答案
一键面试- 创建AIDL文件:
- 在
src/main/aidl
目录下创建.aidl
文件(如果没有aidl
目录需手动创建)。此文件定义了跨进程通信的接口,语法类似Java接口定义,但有一些特殊规则,比如支持的数据类型有限,自定义类型需按特定规则处理等。例如定义一个简单的接口:
interface IMyAidlInterface { void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString); }
- 在
- 生成Java代码:
- 当你创建或修改AIDL文件后,Gradle会自动生成对应的Java接口文件。该文件在
build/generated/source/aidl
目录下,它包含了AIDL接口及相关Stub类等,Stub类是实现跨进程通信的关键部分。
- 当你创建或修改AIDL文件后,Gradle会自动生成对应的Java接口文件。该文件在
- 服务端实现:
- 创建服务:继承
Service
类,例如:
class MyService : Service() { override fun onBind(intent: Intent): IBinder? { // 返回下面实现的Binder实例 return myBinder } }
- 实现AIDL接口:创建一个类继承自生成的
Stub
类,并重写其中定义的方法,例如:
private val myBinder = object : IMyAidlInterface.Stub() { override fun basicTypes(anInt: Int, aLong: Long, aBoolean: Boolean, aFloat: Float, aDouble: Double, aString: String) { // 实现具体业务逻辑 } }
- 注册服务:在
AndroidManifest.xml
文件中注册该服务,例如:
<service android:name=".MyService" android:exported="true" android:process=":remote"> <intent - filter> <action android:name="com.example.IMyAidlInterface" /> </intent - filter> </service>
- 创建服务:继承
- 客户端实现:
- 绑定服务:在客户端使用
bindService
方法绑定服务,例如:
val intent = Intent("com.example.IMyAidlInterface") intent.setPackage("com.example.server") bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)
- 创建ServiceConnection:实现
ServiceConnection
接口,在onServiceConnected
方法中获取AIDL接口实例,例如:
private val serviceConnection = object : ServiceConnection { override fun onServiceConnected(name: ComponentName, service: IBinder) { val iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service) try { iMyAidlInterface.basicTypes(1, 2L, true, 3.0f, 4.0, "test") } catch (e: RemoteException) { e.printStackTrace() } } override fun onServiceDisconnected(name: ComponentName) { // 处理服务断开连接的情况 } }
- 使用AIDL接口:通过获取到的接口实例调用其中定义的方法,实现跨进程通信。同时要注意处理
RemoteException
异常,因为跨进程通信可能会出现连接中断等问题。 - 解绑服务:在不需要使用服务时,调用
unbindService
方法解绑服务,例如:
unbindService(serviceConnection)
- 绑定服务:在客户端使用