首页 > 解决方案 > 如何通过 Messenger onclick 发送远程服务消息

问题描述

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

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

你能给我什么建议?

标签: javaandroidkotlin

解决方案


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

  1. 我正在使用EventBus从 Activity 向 Service 发送消息,这是示例
  2. 在服务中使用本地变量发送消息
  3. 发送到另一个应用程序

推荐阅读