首页 > 编程语言 >车机 Android 环境下利用 CarAudioService 实现自定义 Java 服务自启动

车机 Android 环境下利用 CarAudioService 实现自定义 Java 服务自启动

时间:2023-12-12 09:55:48浏览次数:43  
标签:Java 自定义 service bound start myService user 自启动 name

注意:本文基于 Android 11 进行分析
Qidi 2023.11.28 (MarkDown & Haroopad)


0. 简介 Android RO (Resource Overlay) 机制

Overlay 实现的效果正如其字面意思,就是“在原有效果的基础上再叠加一些效果”。

Android 提供了两种实现方式:

通过 RO 机制,我们就可以将自己编写的 Java 服务在系统启动时运行起来。


1. 实现自定义 Java 服务

假设我们要实现的自定义服务名叫 myService,为了使它可以正常被 CarAudioService 拉起,需要在myServiceAndroidManifest.xml 中添加 directBootAware 属性:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    coreApp="true"
    tools:ignore="MissingVersion"
    package="com.your_company_name.myService"
    android:sharedUserId="android.uid.system">
    ......
    <application
        android:allowBackup="true"
        tools:ignore="All"
        android:label="myService"
        android:persistent="true"
        android:directBootAware="true"
        android:supportsRtl="true" >

        <service
            android:name=".myService"
            android:singleUser="true"
            android:exported="true"
            android:permission="android.car.permission.CAR_CONTROL_AUDIO_SETTINGS"
            tools:ignore="All"
            android:enabled="true">
            <intent-filter>
                <action android:name="com.your_company_name.myService"/>
            </intent-filter>
        </service>

        <!-- functionalities of myService depend on calls to below libraries -->
        <uses-library
            android:name="com.your_company_name.audio"
            android:required="true"/>
        <uses-library
            android:name="com.your_company_name.effect"
            android:required="true"/>
    </application>
</manifest>

随后实现 myService 代码,和实现普通 service 没有区别,示例 vendor/your_company_name/packages/src/com/your_company_name/myService.java 如下:

package com.your_company_name.myService;

// some dependent packages
import android.util.Log;
import xxxx;

public class myService extends Service {

	private static final String TAG = "myService";

	......

    @Override
    public IBinder onBind(Intent intent) {
        // return a binder object to caller
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    public void onCreate() {
    	Log.i(TAG, "Creating myService...");
        super.onCreate();
        // creating and initializing myService
    }


	// implementation of some myService methods here
    ......


    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
    }
}

如此,自定义服务 myService 就编写完成了。接下来我们还要做一些改动,让 myService 在系统启动时能自动被 CarAudioService 拉起。


2. 对 CarAudioService 配置文件进行编译时 Overlay

CarAudioService 新建 Overlay 配置文件device/your_company_name/qcom/lunch_target_name/overlay/packages/services/Car/service/res/values/config.xml

<resources>
    <!-- The services that needs to be started earlier in the boot sequence and in particular order.
         Every item in this array contains a flatten component name of a service that needs to be
         started and a list of parameters after hashtag symbol. Here's the format:

         <item>com.bar.foo/.Service#bind={bind|start|startForeground},user={all|system|foreground},
         trigger={asap,userUnlocked}</item>

         bind: bind - start service with Context#bindService
               start - start service with Context#startService
               startForeground - start service with Context#startForegroundService
               If service was bound it will be restarted unless it is constantly crashing.
               The default value is 'start'
         user: all - the service will be bound/started for system and all foreground users
               system - the service will be started/bound only for system user (u0)
               foreground - the service will be bound/started only for foreground users
               The default value is 'all'
         trigger: indicates when the service needs to be started/bound
               asap - the service might be bound when user is not fully loaded, be careful with
                      this value, the service also needs to have directBootAware flag set to true
               userUnlocked - start service when user unlocked the device
               The default value is 'userUnlocked'

         If the service bound/started for foreground user it will be unbound/stopped when user
         is no longer foreground.
     -->
    <string-array translatable="false" name="config_earlyStartupServices">
        <item>com.your_company_name.myService/.myService#bind=start,user=system,trigger=asap</item>
    </string-array>
</resources>

然后在 makefile 中将上述 overlay 文件路径添加到环境变量 PRODUCT_PACKAGE_OVERLAYS 中。以我使用的代码环境为例,在 device/your_company_name/qcom/lunch_target_name/lunch_target_name.mk 中添加以下语句(当然你也可以添加到别的 makefile 中,比如 device.mk):

PRODUCT_PACKAGE_OVERLAYS += device/your_company_name/qcom/$(TARGET_PRODUCT)/overlay

至此,所有需要的改动都已完成。接下来只要确保编译通过,并烧写到板子上,就能在开机日志中看到 myService 被拉起来的打印了。

标签:Java,自定义,service,bound,start,myService,user,自启动,name
From: https://www.cnblogs.com/qidi-huang/p/start_customized_java_service_using_caraudioservice.h

相关文章

  • Unreal C++自定义Actor设置StaticMesh和Material
    1.新建第三人称c++游戏(其它模板开局也可以的)2.新建继承自Actor的c++类3.添加静态网格体成员SM_MyActor,并在构造函数中进行相应的初始化UCLASS()classMYPROJECT9S_APIAMyActor:publicAActor{GENERATED_BODY()protected:/**Pleaseaddavariabledescripti......
  • java时间时区学习
    1、时间戳时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲,时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据2、格林威治时间格林尼治平时(英语:Greenw......
  • 微信小程序自定义顶部导航栏并适配不同机型
    前言在小程序中,顶部导航栏是一个非常重要的组件,它不仅可以方便用户进行页面切换,还可以提高用户体验。默认情况下,小程序的顶部导航栏是由系统自动生成的,我们只能修改一些基本的样式,如背景色、文字颜色等。但是,如果想要实现更加复杂的样式,如自定义图标、自定义背景等,而且在不同的手......
  • Java多线程编程
    本文中简单介绍一些java多线程相关的内容1.多线程基础Java通过java.lang.Thread类和java.util.concurrent包提供了多线程支持。一个线程可以通过继承Thread类或实现Runnable接口来创建。classMyThreadextendsThread{publicvoidrun(){//线程执行的代码}......
  • power query自定义列和条件列
    Excel从基础到M函数PowerQuery超级整理建议使用office365进入PQ:选中表格任意位置——开始——数据——自表格区域——勾选表包含标题——确定——进入PQ编辑器 要使用PQ编辑器,表格只能支持两种格式:1、公式里设置表格名称(选中表格任意位置——数据——自表格/区域——‘创......
  • Java第七课_面向对象编程
    1.面向对象的编程对象publicclassPractice01{publicstaticvoidmain(String[]args){/*面向对象的编程,将一切事项都视为对象.对象用类来描述,过程在类里实现.使用时只需要调用类,不需要再考虑如何实现.将对象的共同特征进行......
  • Java学习之路(十六)
    Java学习之路(十六)1、File类1.1、File类概述和构造方法【应用】File类介绍它是文件和目录路径名的抽象表示文件和目录是可以通过File封装成对象的对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已.它可以是存在的,也可以是不存在的.将来是要通过具体......
  • Java学习之路(十七)
    Java学习之路(十七)1、字符流1.1、为什么会出现字符流【理解】字符流的介绍由于字节流操作中文不是特别的方便,所以Java就提供字符流字符流=字节流+编码表中文的字节存储方式用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼......
  • javaweDay1补充
    1.<label>标签可以使label标签中所包含的任何区域都可以聚焦到一个点如果没有label则必须点击那个圆圈才可以选上,而若有点击男也可以选中。2.下图中value后跟的值表明勾选男的时候提交表单的提交为1若改为男则是男3select定义下拉列表,option定义列表项 4.<textarea>文本......
  • Java学习之路(十五)
    Java学习之路(十五)1、Map集合1.1、Map集合概述和特点【理解】Map集合概述interfaceMap<K,V>K:键的类型;V:值的类型Map集合的特点双列集合,一个键对应一个值键不可以重复,值可以重复Map集合的基本使用publicclassMapDemo01{publicstaticvoidmain(Strin......