Aidl简单使用例子

本文介绍了Android中AIDL(Android Interface Definition Language)的基本使用,通过创建aidlClient和aidlServer两个模块来演示如何实现跨进程通信。在AIDL的帮助下,开发者可以让一个APP与另一个APP的Service进行交互。文章内容包括AIDL接口定义、服务BookService的创建、客户端如何连接并操作Service,以及在实际应用中的注意事项,如隐式Intent启动Service、设置service包名、启动前台service等。然而,在API 32上启动Service遇到了问题,解决方案尚未提及。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Aidl简单使用例子

android-binder-demo

AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写,对于小白来说,AIDL的作用是让你可以在自己的APP里绑定一个其他APP的service,这样你的APP可以和其他APP交互。

打开AndroidStudio创建两个module,例如 aidlClient aidlServer

1.aidl接口文件

// IBook.aidl
package com.example.androidbinddemo;

// Declare any non-default types here with import statements

interface IBook {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void borrowBook(String number, int count);
}

2.创建一个服务例如 BookService

class BookService : Service() {

    private var handler = Handler(Looper.getMainLooper())

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        println("xxxx onStartCommand")
        Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
        return super.onStartCommand(intent, flags, startId)
    }

    override fun onBind(p0: Intent?): IBinder {
        return object : IBook.Stub() {
            override fun borrowBook(number: String?, count: Int) {
                println("xxxx borrow number = $number count = $count")
                handler.post {
                    Toast.makeText(
                        this@BookService,
                        "borrowBook $number $count",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }
        }
    }
}

3.aidlClient 如何连接BookService操作呢?

private var serviceConnection: ServiceConnection? = null

serviceConnection = object : ServiceConnection {
    override fun onServiceConnected(p0: ComponentName?, p1: IBinder?) {
        println("xxxx onServiceConnected p0 = [${p0}], p1 = [${p1}]")
        val iBook = IBook.Stub.asInterface(p1)
        iBook?.borrowBook("you are best!",202288)
    }

    override fun onServiceDisconnected(p0: ComponentName?) {
        println("xxxx onServiceDisconnected p0 = [${p0}]")
    }
}

val ret = bindService(
    Intent("com.example.androidbinddemo.BookService").apply {
        setPackage("com.example.androidbinddemo")
    },
    serviceConnection as ServiceConnection,
    Service.BIND_AUTO_CREATE
)
println("xxxx bindService ret = $ret")

4.实例

viewBinding.test.setOnClickListener {
    if (iBookInterface == null) {
        Toast.makeText(it.context, "未获取到binder对象", Toast.LENGTH_SHORT).show()
    } else {
        iBookInterface?.borrowBook("you are best!", 202288)
    }
}

在这里插入图片描述
注意事项

  1. 最好使用隐式itennt启动service,并且设置service所在的包名,否则可能无法启动。
  2. 启动service在高版本中是红notificationChannel启动前台service.
  3. 在api32无法启动service,我找不到解决方法,惭愧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值