android 进程间通信 AIDL
引言进程间通信。
引言
AIDL(Android Interface Definition Language)是 Android 跨进程通信的核心。本文从基础到模块化实践,结合项目示例,介绍 AIDL 的原理、实现与优化。
下载demo:
https://download.csdn.net/download/wulong756273/91979638
遇到的问题:
https://blog.csdn.net/wulong756273/article/details/151934707?spm=1001.2014.3001.5502
第一部分:AIDL 基础概念
什么是 AIDL?
AIDL 是 Android 的接口定义语言,用于跨进程通信(IPC),基于 Binder 机制。
为什么需要 AIDL?
在 Android 中,应用运行在独立进程中,进程间不能直接共享内存。AIDL 提供进程间通信能力。
// 场景1:系统服务调用
val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
val phoneNumber = telephonyManager.line1Number // 跨进程调用
// 场景2:应用间通信
val intent = Intent("com.example.service.ACTION")
bindService(intent, connection, Context.BIND_AUTO_CREATE) // 跨应用调用
AIDL 支持的数据类型
- 基本类型:int, float, boolean, String
- 集合类型:List, Map
- 自定义类型:需要实现 Parcelable
第二部分:AIDL 实现步骤
步骤1:定义 AIDL 接口
// IMathService.aidl
package com.robot.testaidl.service;
interface IMathService {
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
float divide(float a, float b);
String getServiceStatus();
}
步骤2:实现服务端
class MathService : Service() {
private val binder = object : IMathService.Stub() {
override fun add(a: Int, b: Int): Int {
Log.d(TAG, "add: $a + $b")
return a + b
}
override fun subtract(a: Int, b: Int): Int {
Log.d(TAG, "subtract: $a - $b")
return a - b
}
override fun multiply(a: Int, b: Int): Int {
Log.d(TAG, "multiply: $a * $b")
return a * b
}
override fun divide(a: Float, b: Float): Float {
Log.d(TAG, "divide: $a / $b")
if (b == 0f) {
throw IllegalArgumentException("Division by zero")
}
return a / b
}
override fun getServiceStatus(): String {
Log.d(TAG, "getServiceStatus called")
return "MathService is running"
}
}
override fun onBind(intent: Intent?): IBinder? = binder
}
步骤3:实现客户端
class MainActivity : AppCompatActivity() {
private var mathService: IMathService? = null
private var isServiceBound = false
private val serviceConnection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
Log.d(TAG, "Service connected")
mathService = IMathService.Stub.asInterface(service)
isServiceBound = true
updateUI()
}
override fun onServiceDisconnected(name: ComponentName?) {
Log.d(TAG, "Service disconnected")
mathService = null
isServiceBound = false
updateUI()
}
}
private fun bindService() {
val intent = Intent("com.robot.testaidl.MathService")
intent.setPackage("com.robot.testaidl")
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)
Toast.makeText(this, "Connecting to service...", Toast.LENGTH_SHORT).show()
}
private fun performOperation(operation: String) {
if (!isServiceBound || mathService == null) {
Toast.makeText(this, "Please connect to service first", Toast.LENGTH_SHORT).show()
return
}
val num1Str = editText1.text.toString()
val num2Str = editText2.text.toString()
if (num1Str.isEmpty() || num2Str.isEmpty()) {
Toast.makeText(this, "Please enter both numbers", Toast.LENGTH_SHORT).show()
return
}
try {
val service = mathService ?: return
val result = when (operation) {
"add" -> {
val num1 = num1Str.toInt()
val num2 = num2Str.toInt()
service.add(num1, num2)
}
"subtract" -> {
val num1 = num1Str.toInt()
val num2 = num2Str.toInt()
service.subtract(num1, num2)
}
"multiply" -> {
val num1 = num1Str.toInt()
val num2 = num2Str.toInt()
service.multiply(num1, num2)
}
"divide" -> {
val num1 = num1Str.toFloat()
val num2 = num2Str.toFloat()
service.divide(num1, num2)
}
else -> 0
}
resultText.text = "Result: $result"
// 获取服务状态
val status = service.getServiceStatus()
Log.d(TAG, "Service status: $status")
} catch (e: Exception) {
Log.e(TAG, "Error performing operation: ${e.message}")
resultText.text = "Error: ${e.message}"
Toast.makeText(this, "Error: ${e.message}", Toast.LENGTH_SHORT).show()
}
}
}
步骤4:服务注册
<!-- AndroidManifest.xml -->
<service
android:name=".MathService"
android:enabled="true"
android:exported="true"
android:process=":math_service">
<intent-filter>
<action android:name="com.robot.testaidl.MathService" />
</intent-filter>
</service>
第三部分:进程配置与优化
进程配置类型
- 私有进程:android:process=":service_name"
- 全局进程:android:process="service_name"
- 默认进程:不指定 process 属性
进程隔离验证
// 日志验证
MathService Process ID: 32450
MathService Process Name: com.robot.testaidl:math_service
MainActivity Process ID: 32408
MainActivity Process Name: com.robot.testaidl
性能优化策略
// 1. 缓存计算结果
private val cache = mutableMapOf<String, String>()
// 2. 使用线程池
private val threadPool = Executors.newFixedThreadPool(4)
// 3. 批量操作
fun batchCalculate(operations: List<Operation>): List<Result>
第四部分:模块化架构
为什么需要模块化?
- 代码复用
- 职责分离
- 独立编译
- 团队协作
模块化实现
// 项目结构
testAidlDemo/
├── app/ # 主应用模块
│ ├── src/main/java/com/robot/testaidl/
│ │ └── MainActivity.kt # 客户端Activity
│ └── build.gradle.kts # 主应用配置
├── mod_testAidl/ # AIDL服务模块
│ ├── src/main/
│ │ ├── aidl/com/robot/testaidl/service/
│ │ │ └── IMathService.aidl # AIDL接口定义
│ │ ├── java/com/robot/testaidl/service/
│ │ │ └── MathService.kt # 服务实现
│ │ └── AndroidManifest.xml # 服务注册
│ └── build.gradle.kts # 模块配置
└── settings.gradle.kts # 项目设置
模块配置
// mod_testAidl/build.gradle.kts
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
}
android {
namespace = "com.robot.testaidl.service"
buildFeatures {
aidl = true
}
}
// app/build.gradle.kts
dependencies {
implementation(project(":mod_testAidl"))
}
模块化优势
- 代码组织清晰
- 构建优化
- 开发效率提升
- 维护成本降低
第五部分:实际应用场景
计算密集型服务
// 图像处理服务
interface IImageProcessingService {
Bitmap processImage(Bitmap input, ProcessingConfig config);
List<Face> detectFaces(Bitmap image);
String generateThumbnail(Bitmap image);
}
数据同步服务
// 数据同步服务
interface IDataSyncService {
String syncData(List<DataItem> localData);
String uploadFile(byte[] fileData, String fileName);
String downloadFile(String fileId);
}
系统集成服务
// 系统集成服务
interface ISystemIntegrationService {
String callExternalAPI(String endpoint, Map<String, String> params);
String processBusinessLogic(BusinessData data);
String generateReport(ReportData data);
}
第六部分:最佳实践与注意事项
最佳实践
- 接口设计简洁
- 错误处理完善
- 性能优化
- 安全考虑
常见问题
- 内存泄漏:及时解绑服务
- 异常处理:捕获 RemoteException
- 类型限制:仅支持 AIDL 类型
- 调试复杂:多进程调试
性能对比
// 本地调用:~1ns
val result = localService.add(5, 3)
// AIDL调用:~1ms (1000倍差距)
val result = aidlService.add(5, 3)
第七部分:未来发展趋势
新技术
- Jetpack Compose
- Kotlin Multiplatform
- 微服务架构
优化方向
- 性能优化
- 开发体验
- 架构演进
总结
AIDL 是 Android 跨进程通信的核心。通过模块化,可提升可维护性与复用性。合理使用 AIDL 有助于构建更稳健的架构。
学习建议
- 理解 Binder 机制
- 多做实践
- 关注性能
- 学习最佳实践
本文从基础到实践,结合项目示例,帮助开发者掌握 AIDL 的使用与优化。
更多推荐
所有评论(0)