一、基本使用
使用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-> 请求远程服务
流程图