IPC之Messenger传递数据

一、基本使用

使用Messenger通信是基于binder途径进行传递数据,和AIDL类似,都是通过客户端绑定服务的形式实现数据传递

步骤如下:

1、在 manifest中注册服务,作为远程服务

<service android:name=".service.RemoteService"    
android:enabled="true"    
android:exported="true"    
android:process=".remote"/>

2、客户端绑定服务通过service获取messenger对象,并通过Messenger发送消息

package com.gee.peter.testapplication.activity
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
import android.os.Bundle
import android.os.IBinder
import android.os.Message
import android.os.Messenger
import android.support.v7.app.AppCompatActivity
import android.util.Log
import android.widget.Button
import com.gee.peter.testapplication.R
import com.gee.peter.testapplication.service.RemoteService

class MainActivity : AppCompatActivity() {
    private var messenger: Messenger? = null
    private var connection: LocalServiceConnection = LocalServiceConnection()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        bindRemoteService()
        initView()
    }

    private fun initView() {
        val intent = Intent()
        val btnRequest = findViewById<Button>(R.id.btn_send_broadcast)
        btnRequest.setOnClickListener {
            if (null == messenger) {
                return@setOnClickListener
            }
            val msg = Message.obtain()
            msg.what = 1
            var bundle = Bundle()
            bundle.putString("Extra", "请求远程服务")
            msg.data = bundle
            // 通过messenger向service发送消息
            messenger!!.send(msg)

        }

    }

    /**
     * 绑定服务
     */
    private fun bindRemoteService() {
        var intent = Intent()
        intent.setClass(this, RemoteService::class.java)
        bindService(intent, connection, Context.BIND_AUTO_CREATE)
    }

    inner class LocalServiceConnection : ServiceConnection {
        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
            messenger = Messenger(service)
            Log.e("peter", "绑定服务")
        }

        override fun onServiceDisconnected(name: ComponentName?) {
            Log.e("peter", "服务断开")
        }

    }

    override fun onDestroy() {
        super.onDestroy()
        // 服务解绑
        unbindService(connection)

    }

}


3、服务端通过onBind方法获取messager获取binder对象,结合handler接收和发送数据

package com.gee.peter.testapplication.service

import android.app.Service
import android.content.Intent
import android.os.Handler
import android.os.IBinder
import android.os.Message
import android.os.Messenger
import android.util.Log

/**
 *  Created by geqipeng
 *  date : 2019/3/14
 *  desc : 远程service 
 */
open class RemoteService:Service(){
    private var messenger:Messenger?=null
    override fun onCreate() {
        super.onCreate()
        // 创建handler,用于接收和发送消息
        val handler=LocalHandler()
        // 创建messenger
        messenger=Messenger(handler)
    }

    override fun onBind(intent: Intent?): IBinder {
        // 通过messenger获取binder对象进行通信
        return messenger?.binder!!
    }

    inner class LocalHandler:Handler(){
        override fun handleMessage(msg: Message?) {
            super.handleMessage(msg)
            if (msg != null) {
                val data=msg.data.getString("Extra")
                Log.e("peter","收到消息: what is-> "+msg.what+" data is-> $data")
            }
        }
    }
}

4、服务端收到的结果:

03-14 09:54:51.175 18640-18640/.remote E/peter: 收到消息: what is-> 1 data is-> 请求远程服务

流程图
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值