//step1:新建类继承Handler class ClientHandler(private val activity: MainActivity) : Handler(Looper.getMainLooper()) { override fun handleMessage(msg: Message){ super.handleMessage(msg) when (msg.what) { 10001 -> { val info = (msg.obj as Bundle).get("data") as String activity.log("收到回信:$info") } 10002 -> { val info = (msg.obj as Bundle).get("index") as Int activity.log("收到回信:$info") } 10003 -> { val info = (msg.obj as Bundle).get("user") as User activity.log("收到回信:$info") } } } }
//step2:创建信使 private val clientMessenger: Messenger = Messenger(ClientHandler(this))
override fun onServiceDisconnected(name: ComponentName?){ log("service disconnect") } }
companion object { const val PKG = "com.allens.sample_service" const val CLS = "com.allens.sample_service.messenger.MessengerService" }
override fun onCreate(savedInstanceState: Bundle?){ super.onCreate(savedInstanceState) val binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root)
//使用此用例之前 请先运行 sample-service binding.linear.addView(MaterialButton(this).apply { text = "绑定服务" setOnClickListener { //step4:使用bindService连接 val intent = Intent() //参数1:appId //参数2:对应Service的路劲 intent.component = ComponentName(PKG, CLS) //参数1:当前的intent意图。 //参数2:连接监听器 //参数3:类型 BIND_AUTO_CREATE:只要绑定存在,就自动创建服务 val bindService = context.bindService(intent, connect, BIND_AUTO_CREATE) if (!bindService) { log("绑定服务失败") } } })
binding.linear.addView(MaterialButton(this).apply { text = "解除绑定" setOnClickListener { context.unbindService(connect) } })
首先解释一下为什么要指定进程的appId,在Android11 上面会出现ActivityManager: Unable to start service not found.无法访问其他的进程。原因是在Android11加入了管理软件包可见性,所以需要在请求的进程中去添加queries字段申明需要访问的进程包名
//step1:继承Service class MessengerService : Service() {
//step2:新建类继承Handler class MessengerHandler : Handler(Looper.getMainLooper()) { override fun handleMessage(msg: Message){ super.handleMessage(msg)
val acceptBundle = msg.obj as Bundle when (msg.what) { 10001 -> { val info = acceptBundle.get("data") as String log("服务端:收到String类型的数据:$info")
//回复信使 val messenger = msg.replyTo as Messenger val message: Message = Message.obtain(null, msg.what) val bundle = Bundle() bundle.putString("data", "我是服务端,我收到了你的消息{$info}") message.obj = bundle messenger.send(message) } 10002 -> { val index = acceptBundle.get("index") as Int log("服务端:收到Int类型的数据:$index")
//回复信使 val messenger = msg.replyTo as Messenger val message: Message = Message.obtain(null, msg.what) val bundle = Bundle() bundle.putInt("index", 10086) message.obj = bundle messenger.send(message) }
10003 -> { val user = acceptBundle.get("user") as User log("服务端:收到自定义类型的数据:$user")
//回复信使 val messenger = msg.replyTo as Messenger val message: Message = Message.obtain(null, msg.what) val bundle = Bundle() bundle.putSerializable("user",User("allens",20)) message.obj = bundle messenger.send(message) } } }
private fun log(info: String){ Log.i("sample-allens", info) } }
//step3:创建信使 private val mMessenger = Messenger(MessengerHandler())
override fun onBind(intent: Intent?): IBinder? { //step4:将Messenger对象的Binder返回给客户端 return mMessenger.binder }