Android 轻量级双向 IPC 通信 Messenger
Service 服务端示例:
// MessengerService.kt
class MessengerService : Service() {
// 处理客户端消息的 Handler
private val handler = object : Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message) {
when (msg.what) {
MSG_SAY_HELLO -> {
// 处理收到的消息
val receivedData = msg.data.getString("data")
// 发送回复消息
val replyMessenger = msg.replyTo
val replyMsg = Message.obtain(null, MSG_HELLO_REPLY)
replyMsg.data = Bundle().apply {
putString("reply", "Hello, I got your message: $receivedData")
}
replyMessenger.send(replyMsg)
}
}
}
}
// 创建 Messenger 对象
private val messenger = Messenger(handler)
override fun onBind(intent: Intent): IBinder {
return messenger.binder
}
companion object {
const val MSG_SAY_HELLO = 1
const val MSG_HELLO_REPLY = 2
}
}
客户端示例:
// MainActivity.kt
class MainActivity : AppCompatActivity() {
private var messenger: Messenger? = null
// 处理服务端回复的 Handler
private val replyHandler = object : Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message) {
when (msg.what) {
MessengerService.MSG_HELLO_REPLY -> {
val reply = msg.data.getString("reply")
Toast.makeText(this@MainActivity, reply, Toast.LENGTH_SHORT).show()
}
}
}
}
// 用于接收回复的 Messenger
private val replyMessenger = Messenger(replyHandler)
private val connection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
messenger = Messenger(service)
sendMessage()
}
override fun onServiceDisconnected(name: ComponentName?) {
messenger = null
}
}
private fun sendMessage() {
messenger?.let {
val msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO)
msg.data = Bundle().apply {
putString("data", "Hello from client!")
}
// 设置回复的 Messenger
msg.replyTo = replyMessenger
try {
it.send(msg)
} catch (e: RemoteException) {
e.printStackTrace()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 绑定服务
Intent(this, MessengerService::class.java).also { intent ->
bindService(intent, connection, Context.BIND_AUTO_CREATE)
}
}
override fun onDestroy() {
super.onDestroy()
unbindService(connection)
}
}
Messenger 的特点:
- 基于 Handler 机制
- 消息队列保证顺序
- 自动处理线程同步
- 适合轻量级IPC
- 支持双向通信
使用场景:
- 远程服务通信
- 进程间消息传递
- 简单数据同步
- 前台服务交互
数据传递限制:
- 只支持 Bundle 可序列化的数据
- 不支持大数据量传输
- 不支持并发调用
- 不支持复杂对象传递
优势:
- 使用简单
- 无需编写 AIDL
- 线程安全
- 性能开销小
注意事项:
- 及时释放资源
- 处理异常情况
- 避免 ANR
- 考虑进程存活