Android Service aidl使用及进阶

Android Service 代码地址

AIDL:Android 接口定义语言,可以利用它定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信。在 Android 中,一个进程通常无法访问另一个进程的内存。因此,为进行通信,进程需将其对象分解成可供操作系统理解的原语,并将其编组为可供操作的对象。编写执行该编组操作的代码较为繁琐,因此 Android 使用 AIDL 为简化此问题。

注意: 只有在需要不同应用的客户端通过 IPC 方式访问服务,并且希望在服务中进行多线程处理时,才有必要使用 AIDL。如果无需跨不同应用执行并发 IPC,则应通过实现 Binder 来创建接口;或者,如果想执行 IPC,但不需要处理多线程,请使用 Messenger 来实现接口。

使用AIDL

服务端定义

  1. 创建aidl文件

    此文件定义带有方法签名的编程接口。

  2. 实现接口

    Android SDK 工具会基于定义的 .aidl 文件,使用 Java 编程语言生成接口。此接口拥有一个名为 Stub 的内部抽象类,用于扩展 Binder 类并实现 AIDL 接口中的方法。代码中必须扩展 Stub 类并实现这些方法。

  3. 向客户端公开接口

    实现 Service 并重写 onBind(),从而返回 Stub 类的实现。

创建 .aidl 文件

AIDL 使用一种简单语法,允许通过一个或多个方法(可接收参数和返回值)来声明接口。参数和返回值可为任意类型,甚至是 AIDL 生成的其他接口。(AIDL文件的创建和java接口的创建类似,或者就是按照创建java接口的方式(注意:不能像Java 8以上带非抽象方法),然后将文件的扩展名修改为 .aidl)。

AIDL支持的数据:

  • Java 编程语言中的所有基本数据类型(如 int、long、char、boolean 等)
  • String、CharSequence
  • 自定义的Bean(查看以下 “在aidl中使用自定义对象时的步骤或者注意” 内容)
  • List(List 中的所有元素必须是以上列表中支持的数据类型,或者声明的由 AIDL 生成的其他接口或 Parcelable 类型。可以选择将 List 用作“泛型”类(例如,List)。尽管生成的方法旨在使用 List 接口,但另一方实际接收的具体类始终是 ArrayList。)
  • Map(Map 中的所有元素必须是以上列表中支持的数据类型,或者声明的由 AIDL 生成的其他接口或 Parcelable 类型。不支持泛型 Map(如 Map<String,Integer> 形式的 Map)。尽管生成的方法旨在使用 Map 接口,但另一方实际接收的具体类始终是 HashMap。)

在aidl中使用自定义对象时的步骤或者注意:

  1. 实现 Parcelable 接口

  2. 创建声明 Parcelable 类的 .aidl 文件(如下: BookBean.aidl)

     package com.renj.service.bean;
    
     parcelable BookBean; // BoodBean 为自定义的对象
    
  3. 自定义的数据即使与aidl接口文件在相同的包内,也需要通过 import 导包。

定义服务接口时,请注意:<

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值