AIDL接入Android 8.0和Android 11以上版本需要添加的设置

发布时间:2023年12月20日

直接开始正题

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>
文章来源:https://blog.csdn.net/g777520/article/details/135080873
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。