当前位置: 首页 > news >正文

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
- 考虑进程存活  

相关文章:

  • 前端项目打包过滤指定icon文件
  • 100天精通Python(爬虫篇)——第113天:爬虫基础模块之urllib详细教程大全
  • OpenCV(8):图像直方图
  • 【备赛】在keil5里面创建新文件的方法+添加lcd驱动
  • https和http有什么区别
  • VMware 与 CentOS 安装指南
  • Spring Core面试题
  • P1038 [NOIP 2003 提高组] 神经网络
  • 数据结构——静态顺序表,动态顺序表
  • 三维重建_点云重建方法及开源框架推荐
  • 基于 IMX6ULL 的环境监测自主调控系统
  • 网络安全-php安全知识点
  • 下载安装umamba教程使用命令
  • 2024 nginx已知 sztu.edu.cn.key和sztu.edu.cn.pem配置ssl
  • AIGC技术助力空军招飞,近屿智能开启智能人才培育新征程
  • Docker 搭建 Nginx 服务器
  • w227springboot旅游管理系统设计与实现
  • leetcode刷题记录(一百一十八)——39. 组合总和
  • clickhouse--本地表和分布式表,副本机制,分片集群
  • c++ 典型练习题
  • 音乐节困于流量
  • 美联储主席:供应冲击或更频繁,将重新评估货币政策方法中的通胀和就业因素
  • 商务部回应稀土出口管制问题
  • 国防部:中方愿与俄方不断增强两军关系良好发展势头
  • 刘晓庆被实名举报涉嫌偷税漏税,税务部门启动调查
  • 长三角首次,在铁三赛事中感受竞技与生态的共鸣