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-> 請求遠程服務

流程圖
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章