一、基本使用
使用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-> 請求遠程服務
流程圖