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

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

问题描述

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

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
}

这是服务器的主要活动

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()
}

这是我的客户主要活动

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 从活动向服务发送消息,这是
  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天全站免登陆