在 Frameworks 中使用 AIDL

话不多说,直接切入正题。我们就以 Android 源码为例来说明如何在 Frameworks 中使用 AIDL。
下面是系统的 audio 服务,一个典型的 Frameworks 层 AIDL 的写法。由 AIDL 接口、服务实现、服务发布、服务包装四个部分组成(这里服务实现和发布在一个文件中)。
在这里插入图片描述

1 定义 AIDL 接口

定义后缀名为 aidl 的接口文件 IAudioService.aidl,然后定义需要的方法,这里就只关注 isMasterMute() 这一个方法。

/frameworks/base/media/java/android/media/IAudioService.aidl
17  package android.media;
...
50  /**
51   * {@hide}
52   */
53  interface IAudioService {
   
...
96      boolean isMasterMute();//我们就只关注这一个方法
...
395  }

2 实现具体的服务并注册

想先看完 audio 服务实现流程的同学,看完 2.1 节就可以到第 3 章了,后面其他小节只是为了展示 binder 服务的不同写法。

2.1 写法一:直接继承 IAudioService.Stub,内部类继承 SystemServer

定义的 AudioService.java 直接继承 IAudioService.Stub,然后在该类里实现之前定义的方法。

/frameworks/base/services/core/java/com/android/server/audio/AudioService.java
17  package com.android.server.audio;
...
90  import android.media.IAudioService;
187  /**
197   * @hide
198   */
199  public class AudioService extends IAudioService.Stub
200          implements AccessibilityManager.TouchExplorationStateChangeListener,
201              AccessibilityManager.AccessibilityServicesStateChangeListener {
   
...
4025      public boolean isMasterMute() {
   
4026          return AudioSystem.getMasterMute();
4027      }
...
10525  }

服务实现好后,必须要告诉系统,然后才知道有这么一个服务。所以通过 publishBinderService(Context.AUDIO_SERVICE, mService) 将该服务发布出去,第一个参数是我们给该服务起的名字,第二个参数是实现该服务的类对象,也就是 AudioService 对象。

这个 AudioService 是把服务的注册放在了内部类 Lifecycle 中,而 Lifecycle 继承了 SystemService,因为我们要实现的是一个系统服务,必须要继承它才行。

为了不影响阅读的连贯性,publishBinderService 具体实现请看这篇 AIDL 服务的发布 publishBinderService 和 获取 getService,此处我们先知道它能注册一个 binder 服务就行了。

785      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值