java - 如何通过 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")
}
你能给我什么建议?
解决方案
推荐阅读
- java - Cloud Foundry:如何使用额外的 JVM 命令部署 Spring Boot 应用程序
- javascript - 有没有办法用 React native 录制音频并将其存储为波形文件?
- python - 如何在 AWS Glue 中正确重命名动态数据框的列?
- java - 在java中组合比较器
- c++ - 谜团:将 GNU C 标签指针转换为函数指针,并使用内联 asm 在该块中放置一个 ret。块被优化掉了?
- java - JASPER REPORT:子报表噩梦,数据源是List
- php - PHP 关联数组到 JSON
- spring - WebMvcTest 太贪心了
- python - 如何使用 matplotlib 以紧凑的布局、透明度和高质量保存动画?
- spring-boot - 如何模拟导致非法参数异常的 JDBC 数据源对象说需要属性“数据源”?