直接开始正题
Client端绑定服务代码
val serviceIntent = Intent().apply {
component = ComponentName("包名", "服务类名")
action = "服务Action" //没有可以不写
}
val result = bindService(serviceIntent, connect, Context.BIND_AUTO_CREATE)
println("bindService result $result")
Android 8之后 也就是sdk>= 26 在服务类的onCreate中需要加入启动前台服务的代码,不然无法绑定服务
该代码需要再清单文件加入权限
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
代码如下
override fun onCreate() {
super.onCreate()
//.... 其他代码
startServiceForeground()
}
private fun startServiceForeground() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val channel = NotificationChannel("ChannelID", "NotificationName", NotificationManager.IMPORTANCE_LOW)
manager.createNotificationChannel(channel)
val notification = Notification.Builder(applicationContext, "ChannelID").build()
startForeground(0x111, notification)
}
}
之后是Android11之后 官方进一步对安全做了限制,需要再Client的清单文件下 补充queries 否则还是无法绑定服务
加入queries如下
<queries>
<package android:name="需要绑定的服务的包名"/>
</queries>