如何通过 Messenger 在点击时发送远程服务消息

huangapple go评论101阅读模式
英文:

How to send remote service message onclick via Messenger

问题

以下是翻译好的部分:

我在Android和Kotlin方面还很新。我有一个服务器应用和一个客户端应用。我想从服务器向客户端应用发送字符串。我可以启动服务器,然后将其绑定到客户端应用,但是当我点击按钮时无法发送我的消息。

这是我的服务器部分:

  1. private inner class MessageRequestHandler : Handler() {
  2. override fun handleMessage(msg: Message) {
  3. when (msg.what) {
  4. SEND_MESSAGE_FLAG -> {
  5. val bundle = Bundle()
  6. bundle.putString("key", "Test")
  7. val mesg = Message.obtain(null, SEND_MESSAGE_FLAG)
  8. mesg.obj = bundle
  9. try {
  10. msg.replyTo.send(mesg)
  11. } catch (e: RemoteException) {
  12. Log.i(TAG, "Error: " + e.message)
  13. }
  14. }
  15. }
  16. super.handleMessage(msg)
  17. }
  18. }
  19. private val messageMessenger: Messenger = Messenger(MessageRequestHandler())
  20. override fun onBind(intent: Intent?): IBinder {
  21. return messageMessenger.binder
  22. }
  23. companion object {
  24. private val TAG = MyService::class.java.simpleName
  25. var SEND_MESSAGE_FLAG = 0
  26. }

这是服务器的主要活动:

  1. override fun onCreate(savedInstanceState: Bundle?) {
  2. super.onCreate(savedInstanceState)
  3. setContentView(R.layout.activity_main)
  4. serviceIntent = Intent(applicationContext, MyService::class.java)
  5. }
  6. fun sendLogin(view: View){
  7. startService(serviceIntent)
  8. Toast.makeText(applicationContext, "Service Started", Toast.LENGTH_SHORT).show()
  9. }
  10. fun sendPay(view: View){
  11. Log.i(TAG, "Self Payment")
  12. }
  13. fun sendLogout(view: View){
  14. stopService(serviceIntent)
  15. Toast.makeText(applicationContext, "Service Stopped", Toast.LENGTH_SHORT).show()
  16. }

这是客户端的主要活动:

  1. private var serviceIntent: Intent? = null
  2. var requestMessenger: Messenger? = null
  3. var receiveMessenger: Messenger? = null
  4. private var mIsBound = false
  5. private var messageValue = 0
  6. companion object {
  7. const val GET_RANDOM_NUMBER_FLAG = 0
  8. }
  9. internal inner class recieveHandler : Handler() {
  10. override fun handleMessage(msg: Message) {
  11. messageValue = 0
  12. when (msg.what) {
  13. GET_RANDOM_NUMBER_FLAG -> {
  14. messageValue = msg.arg1
  15. Toast.makeText(applicationContext,"Server: $messageValue",Toast.LENGTH_LONG).show()
  16. println(messageValue)
  17. }
  18. else -> {
  19. }
  20. }
  21. super.handleMessage(msg)
  22. }
  23. }
  24. var serviceConnection: ServiceConnection? = object : ServiceConnection {
  25. override fun onServiceDisconnected(arg0: ComponentName) {
  26. requestMessenger = null
  27. receiveMessenger = null
  28. mIsBound = false
  29. }
  30. override fun onServiceConnected(arg0: ComponentName, binder: IBinder) {
  31. requestMessenger = Messenger(binder)
  32. receiveMessenger = Messenger(recieveHandler())
  33. mIsBound = true
  34. }
  35. }
  36. fun bindServer(v: View) {
  37. serviceConnection?.let { bindService(serviceIntent, it, BIND_AUTO_CREATE) }
  38. if (mIsBound){
  39. Toast.makeText(applicationContext, "Service bound", Toast.LENGTH_SHORT).show()
  40. }
  41. else{
  42. Toast.makeText(applicationContext, "Service not bound", Toast.LENGTH_SHORT).show()
  43. }
  44. }
  45. fun getMessage(view: View) {
  46. if (mIsBound) {
  47. val requestMessage = Message.obtain(null, GET_RANDOM_NUMBER_FLAG)
  48. requestMessage.replyTo = receiveMessenger
  49. try {
  50. requestMessenger!!.send(requestMessage)
  51. } catch (e: RemoteException) {
  52. e.printStackTrace()
  53. }
  54. } else {
  55. Toast.makeText(
  56. applicationContext,
  57. "Service Unbound, can't get message",
  58. Toast.LENGTH_SHORT
  59. ).show()
  60. }
  61. }
  62. override fun onCreate(savedInstanceState: Bundle?) {
  63. super.onCreate(savedInstanceState)
  64. setContentView(R.layout.activity_main)
  65. serviceIntent = Intent()
  66. serviceIntent!!.component = ComponentName("com.my.server", "com.my.server.MyService")
  67. }

你有什么建议吗?

英文:

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 :

  1. private inner class MessageRequestHandler : Handler() {
  2. override fun handleMessage(msg: Message) {
  3. when (msg.what) {
  4. SEND_MESSAGE_FLAG -> {
  5. val bundle = Bundle()
  6. bundle.putString("key", "Test")
  7. val mesg = Message.obtain(null, SEND_MESSAGE_FLAG)
  8. mesg.obj = bundle
  9. try {
  10. msg.replyTo.send(mesg)
  11. } catch (e: RemoteException) {
  12. Log.i(TAG, "Error: " + e.message)
  13. } }
  14. }
  15. super.handleMessage(msg)
  16. }
  17. }
  18. private val messageMessenger: Messenger = Messenger(MessageRequestHandler())
  19. override fun onBind(intent: Intent?): IBinder {
  20. return messageMessenger.binder
  21. }
  22. companion object {
  23. private val TAG = MyService::class.java.simpleName
  24. var SEND_MESSAGE_FLAG = 0
  25. }

Here my Main activity of Server

  1. override fun onCreate(savedInstanceState: Bundle?) {
  2. super.onCreate(savedInstanceState)
  3. setContentView(R.layout.activity_main)
  4. serviceIntent = Intent(applicationContext, MyService::class.java)
  5. }
  6. fun sendLogin(view: View){
  7. startService(serviceIntent)
  8. Toast.makeText(applicationContext, "Service Started", Toast.LENGTH_SHORT).show()
  9. }
  10. fun sendPay(view: View){//When i press button i want to send message to Client from here
  11. Log.i(TAG, "Self Payment")
  12. }
  13. fun sendLogout(view: View){
  14. stopService(serviceIntent)
  15. Toast.makeText(applicationContext, "Service Stopped", Toast.LENGTH_SHORT).show()
  16. }

Here my Client Main Activity

  1. private var serviceIntent: Intent? = null
  2. var requestMessenger: Messenger? = null
  3. var receiveMessenger: Messenger? = null
  4. private var mIsBound = false
  5. private var messageValue = 0
  6. companion object {
  7. const val GET_RANDOM_NUMBER_FLAG = 0
  8. }
  9. internal inner class recieveHandler : Handler() {
  10. override fun handleMessage(msg: Message) {
  11. messageValue = 0
  12. when (msg.what) {
  13. GET_RANDOM_NUMBER_FLAG -> {
  14. messageValue = msg.arg1
  15. Toast.makeText(applicationContext,"Server: $messageValue",Toast.LENGTH_LONG).show()
  16. println(messageValue)
  17. }
  18. else -> {
  19. }
  20. }
  21. super.handleMessage(msg)
  22. }
  23. }
  24. var serviceConnection: ServiceConnection? = object : ServiceConnection {
  25. override fun onServiceDisconnected(arg0: ComponentName) {
  26. requestMessenger = null
  27. receiveMessenger = null
  28. mIsBound = false
  29. }
  30. override fun onServiceConnected(arg0: ComponentName, binder: IBinder) {
  31. requestMessenger = Messenger(binder)
  32. receiveMessenger = Messenger(recieveHandler())
  33. mIsBound = true
  34. }
  35. }
  36. fun bindServer(v: View) {
  37. serviceConnection?.let { bindService(serviceIntent, it, BIND_AUTO_CREATE) }
  38. if (mIsBound){
  39. Toast.makeText(applicationContext, "Service bound", Toast.LENGTH_SHORT).show()
  40. }
  41. else{
  42. Toast.makeText(applicationContext, "Service not bound", Toast.LENGTH_SHORT).show()
  43. }
  44. }
  45. fun getMessage(view: View) {
  46. if (mIsBound) {
  47. val requestMessage = Message.obtain(null, GET_RANDOM_NUMBER_FLAG)
  48. requestMessage.replyTo = receiveMessenger
  49. try {
  50. requestMessenger!!.send(requestMessage)
  51. } catch (e: RemoteException) {
  52. e.printStackTrace()
  53. }
  54. } else {
  55. Toast.makeText(
  56. applicationContext,
  57. "Service Unbound, can't get message",
  58. Toast.LENGTH_SHORT
  59. ).show()
  60. }
  61. }
  62. override fun onCreate(savedInstanceState: Bundle?) {
  63. super.onCreate(savedInstanceState)
  64. setContentView(R.layout.activity_main)
  65. serviceIntent = Intent()
  66. serviceIntent!!.component = ComponentName("com.my.server", "com.my.server.MyService")
  67. }

What you can suggest me?

答案1

得分: 1

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

  1. 我正在使用EventBus从Activity发送消息到Service,在这里有一个示例
  2. 在Service中使用局部变量接收已发送的消息。
  3. 发送到另一个应用。
英文:

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

  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

huangapple
  • 本文由 发表于 2020年10月22日 16:43:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/64478498.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定