如何通过 Messenger onclick 发送远程服务消息 [英] How to send remote service message onclick via Messenger

查看:29
本文介绍了如何通过 Messenger onclick 发送远程服务消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 Android 和 Kotlin 的新手.我有一个服务器应用程序和一个客户端应用程序.我想将字符串从服务器发送到客户端应用程序.我可以启动服务器,然后将客户端应用程序绑定到服务器,但是单击按钮时我无法发送消息.这是我的服务器:

I'm really new on Android and Kotlin.I have one Server app and one Client app. I want to send string from Server to Client app.I can start Server and then bind with Client app to Server but i cannot send my message when button click. Here my Server :

 private inner class MessageRequestHandler : Handler() {
    override fun handleMessage(msg: Message) {
        when (msg.what) {
            SEND_MESSAGE_FLAG -> {
                val bundle = Bundle()
                bundle.putString("key", "Test")

                val mesg = Message.obtain(null, SEND_MESSAGE_FLAG)
                mesg.obj = bundle
                try {
                    msg.replyTo.send(mesg)
                } catch (e: RemoteException) {
                    Log.i(TAG, "Error: " + e.message)
                }                }
        }
        super.handleMessage(msg)
    }
}

private val messageMessenger: Messenger = Messenger(MessageRequestHandler())
override fun onBind(intent: Intent?): IBinder {
    return messageMessenger.binder
}

companion object {
    private val TAG = MyService::class.java.simpleName
    var SEND_MESSAGE_FLAG = 0
}

这里是我服务器的主要活动

Here my Main activity of Server

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    serviceIntent = Intent(applicationContext, MyService::class.java)
}


fun sendLogin(view: View){
    startService(serviceIntent)
    Toast.makeText(applicationContext, "Service Started", Toast.LENGTH_SHORT).show()
}

fun sendPay(view: View){//When i press button i want to send message to Client from here
    Log.i(TAG, "Self Payment")
}

fun sendLogout(view: View){
    stopService(serviceIntent)
    Toast.makeText(applicationContext, "Service Stopped", Toast.LENGTH_SHORT).show()
}

这里是我的客户主要活动

Here my Client Main Activity

private var serviceIntent: Intent? = null
var requestMessenger: Messenger? = null
var receiveMessenger: Messenger? = null
private var mIsBound = false
private var messageValue = 0

companion object {
    const val GET_RANDOM_NUMBER_FLAG = 0
}

internal inner class recieveHandler : Handler() {
    override fun handleMessage(msg: Message) {
        messageValue = 0
        when (msg.what) {
            GET_RANDOM_NUMBER_FLAG -> {
                messageValue = msg.arg1 
                Toast.makeText(applicationContext,"Server: $messageValue",Toast.LENGTH_LONG).show()
                println(messageValue) 
            }
            else -> {
            }
        }
        super.handleMessage(msg)
    }
}

var serviceConnection: ServiceConnection? = object : ServiceConnection {
    override fun onServiceDisconnected(arg0: ComponentName) {
        requestMessenger = null
        receiveMessenger = null
        mIsBound = false
    }

    override fun onServiceConnected(arg0: ComponentName, binder: IBinder) {
        requestMessenger = Messenger(binder)
        receiveMessenger = Messenger(recieveHandler())
        mIsBound = true
    }
}


fun bindServer(v: View) {
    serviceConnection?.let { bindService(serviceIntent, it, BIND_AUTO_CREATE) }
    if (mIsBound){
        Toast.makeText(applicationContext, "Service bound", Toast.LENGTH_SHORT).show()
    }
    else{
        Toast.makeText(applicationContext, "Service not bound", Toast.LENGTH_SHORT).show()
    }

}

fun getMessage(view: View) {
    if (mIsBound) {
        val requestMessage = Message.obtain(null, GET_RANDOM_NUMBER_FLAG)
        requestMessage.replyTo = receiveMessenger
        try {
            requestMessenger!!.send(requestMessage)
        } catch (e: RemoteException) {
            e.printStackTrace()
        }
    } else {
        Toast.makeText(
            applicationContext,
            "Service Unbound, can't get message",
            Toast.LENGTH_SHORT
        ).show()
    }
}

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

    serviceIntent = Intent()
    serviceIntent!!.component = ComponentName("com.my.server", "com.my.server.MyService")
}

你能给我什么建议?

推荐答案

经过 5 天的挑战,我找到了基本的方法.

After 5 days challenging , i found way basically how to do.

  1. 我正在使用 EventBus 从活动向服务发送消息,这里是 示例
  2. 在服务中使用局部变量获取已发送的消息
  3. 发送到另一个应用
  1. I'm sending message from Activity to Service with EventBus here is example
  2. Getting sent message with local variable in Service
  3. Sending to another app

这篇关于如何通过 Messenger onclick 发送远程服务消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆