Android AudioPolicy策略的实现过程分析(二):CarAudioService和自定义音频焦点策略

本文深入剖析Android系统中CarService的启动与CarAudioService的初始化过程,重点讨论CarAudioService如何构建AudioPolicy并注册。同时,详细介绍了自定义音频焦点策略的实现步骤,包括设置AudioPolicyFocusListener和调整音频焦点策略。
摘要由CSDN通过智能技术生成

摘要:
Android系统中与Automotive相关的代码会被编译成一个名为CarService的apk存在于车机中,CarService中包括了众多和Car功能相关的Service,其中就包括CarAudioService。CarAudioService在初始化时会获取系统的音频策略配置参数并试图构造并注册AudioPolicy类,AudioPolicy.java是Java层音频策略的总设计图,其描述了总体音频策略,其中音频焦点策略可以通过setAudioPolicyFocusListener设置

一、CarService的启动及获取服务

概述:
CarService服务在系统启动时被拉起,然后通过ICarImpl初始化并保存所有Service,用户想要获取Service的Manager时必须通过Car类提供的方法

关键类及说明:

关键类 说明
CarService 最先被拉起的服务,Auto模块最主要的服务
ICarImpl Auto模块各种Servcie的管理者,CarService功能的实现者
Car 用户获取Manager的门户,其存在起到隔离用户操作实现解耦的作用

整个Android Automotive部分的代码会被编译成一个apk,既然是apk,那么肯定有AndroidManifest文件:
/packages/services/Car/service/AndroidManifest.xml

	......
    <application android:label="Car service"
                 android:directBootAware="true"
                 android:defaultToDeviceProtectedStorage="true"
                 android:allowBackup="false"
                 android:persistent="true">

        <uses-library android:name="android.test.runner" />
        <service android:name=".CarService"
                android:singleUser="true">
            <intent-filter>
                <action android:name="android.car.ICar" />
            </intent-filter>
        </service>
        <service android:name=".PerUserCarService" android:exported="false" />
        <activity android:name="com.android.car.pm.ActivityBlockingActivity"
                  android:excludeFromRecents="true"
                  android:theme="@android:style/Theme.Translucent.NoTitleBar"
                  android:exported="false"
                  android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>
        </activity>
        ......

可以看到这个APP中存在名为CarService的Service,这个Service在系统启动后会通过bindService的方式被拉起,流程如下:
原创图片,转载请注明出处
在CarService.java的onCreate方法中,会构建一个ICarImpl对象,并调用其init方法,之后调用addService将ICarImpl对象添加到ServiceManager中:

    public void onCreate() {
   
        Log.i(CarLog.TAG_SERVICE, "Service onCreate");
        while(true) {
   
            try {
   
                Thread.sleep(10);
                if ("1".equals(SystemProperties.get("vendor.all.system_server.ready"))) {
   
                    Log.i(CarLog.TAG_SERVICE, "Android Auto UI showed, continue the Car Service.");
                    break;
                }
            } catch (Exception err) {
   
            }
        }
        mCanBusErrorNotifier = new CanBusErrorNotifier(this /* context */);
        mVehicle = getVehicle();

        if (mVehicle == null) {
   
            throw new IllegalStateException("Vehicle HAL service is not available.");
        }
        try {
   
            mVehicleInterfaceName = mVehicle.interfaceDescriptor();
        } catch (RemoteException e) {
   
            throw new IllegalStateException("Unable to get Vehicle HAL interface descriptor", e);
        }

        Log.i(CarLog.TAG_SERVICE, "Connected to " + mVehicleInterfaceName);

        mICarImpl = new ICarImpl(this,
                mVehicle,
                SystemInterface.Builder.defaultSystemInterface(this).build(),
                mCanBusErrorNotifier,
                mVehicleInterfaceName);
        mICarImpl.init();
        SystemProperties.set("boot.car_service_created", "1");

        linkToDeath(mVehicle, mVehicleDeathRecipient);

        ServiceManager.addService("car_service", mICarImpl);
        super.onCreate();
    }

ICarImpl.java的构造方法中new出了众多和Car相关的Service,并把它们全部添加到mAllServices容器中:

    public ICarImpl
  • 1
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MyBatis Plus Wrapper(简称Wrapper)是 MyBatis Plus 提供的一个查询条件构造器,用于动态构建查询条件。它封装了一系列的查询方法,可以通过链式调用来灵活地组合查询条件。 Wrapper 可以用于以下场景: 1. 动态查询:根据业务需求,根据不同条件动态构建查询条件。 2. 多表联查:当需要查询多个关联表时,可以使用 Wrapper 来构建联查条件。 3. Lambda 表达式:Wrapper 支持使用 Lambda 表达式来构建查询条件,使得代码更加简洁易读。 使用 Wrapper 有以下几个步骤: 1. 创建 Wrapper 对象:可以使用 QueryWrapper、UpdateWrapper 等具体的子类来创建 Wrapper 对象。 2. 设置查询条件:通过调用 Wrapper 对象的方法,设置对应的查询条件。 3. 执行数据库操作:使用 MyBatis Plus 提供的 API,执行数据库的查询、更新等操作。 例如,以下示例展示了使用 Wrapper 进行动态查询的代码片段: ```java QueryWrapper<User> wrapper = new QueryWrapper<>(); // 设置条件 wrapper.eq("age", 25); wrapper.like("name", "John"); List<User> userList = userMapper.selectList(wrapper); ``` 在上述示例中,首先创建了一个 QueryWrapper 对象,然后使用 eq 方法设置了 age 字段等于 25 的条件,同时使用 like 方法设置了 name 字段包含 "John" 的条件,最后通过 selectList 方法执行查询操作。 通过使用 Wrapper,我们可以根据实际需求动态构建查询条件,使得查询操作更加灵活和可复用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值