android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程

《Android 车载 Launcher 开发 - 显示 Widget》 通过本文的介绍,相信读者对 Android 车载 Launcher 开发中显示 Widget 有了更深入的了解和认识,能够在实际开发中更好地实现 Widget 的显示功能,提高车载信息娱乐系统的用户体验。集成的方式可以通过在 Launcher 的代码中添加 Widget 的引用和配置信息,或者通过使用第三方的 Widget 框架来实现。除了使用系统提供的 Widget 和开发自定义 Widget 之外,还可以使用第三方的 Widget 框架来实现 Widget 的显示。 阅读详情

官网参考链接:https://developer.android.google.cn/develop/ui/views/appwidgets/overview

1、什么是小部件

App widgets are miniature application views that can be embedded in other applications (such as the home screen) and receive periodic updates。
通俗解释:一个能够定期刷新并且加到其他应用上的微型视图。
更多android framework干货内容请找千里马私聊:https://www.bilibili.com/video/BV1wj411o7A9/

2、小部件的运行机制是什么?

在这里插入图片描述通过 AppWidgetProvider 定义小部件的行为
通过 RemoteView 和布局文件定义小部件的UI
通过AppWidgetManager 更新视图
在manifeset 里注册 AppWidgetProvider(继承于广播),设置监听的action

3、小部件运行在什么进程?

首先明白一下Host进程和widget进程,看如下图所示:
在这里插入图片描述
小部件运行波及的进程,及各个进程的责任:
在这里插入图片描述

小部件的运行逻辑需要分为三部分:AppWidgetProvider 中的逻辑运行在小部件所在应用进程。小部件的数据存储,权限校验的逻辑,widget进程和host进程的沟通桥梁即跨进程通讯中介,运行在system_process中。小部件渲染逻辑在host 进程中。

4、RemoteView如何工作?

RemoteView 继承于Parcelable,可在进程间传递。RemoteView 会将每一个设置的行为转换成相应的Action。在Host 侧进程时再将Action 翻译成对应的行为。

如:
正常自己进程
TextView 的setText方法,直接调mTextView.setText就行
但是这个widget都不是自己widget进程进行的渲染,这里就只能通过RemoteView方式来操作,RemoteView的原理其实就是,传递类是一个方法名字字符,因为字符串是可以跨进程传递的,然后到达了Host进程,Host进程可以根据方法名字的字符串进行反射调用
原理图如下:
在这里插入图片描述

可以看出RemoteViews本质就是个可以进行跨进程控制显示view的媒介,没有像控制自己view那么的方便,对应view的控制接口都需要一一转化,所以还是很不灵活,而且这里注意了,因为view种类可能很多,但是remoteviews就只有固定一些,不支持随意各种view或者自定义
在这里插入图片描述

5、widget开发部分

AppWidgetProviderInfo object 
Describes the metadata for an App Widget, such as the App Widget's layout, update frequency, and the AppWidgetProvider class. This should be defined in XML.
AppWidgetProvider class implementation
Defines the basic methods that allow you to programmatically interface with the App Widget, based on broadcast events. Through it, you will receive broadcasts when the App Widget is updated, enabled, disabled and deleted.

1 准备好AppWidgetProviderInfo信息
AppWidgetProviderInfo 主要来描述Widget的元数据,比如widget的layout,更新频率,一般在xml中进行定义

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="60dp"
    android:minHeight="30dp"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/appwidget_provider"
    android:configure="com.example.android.apis.appwidget.ExampleAppWidgetConfigure"
    android:resizeMode="horizontal"
    >
</appwidget-provider>

最关键的是initialLayout会有初始化布局,即widget默认显示布局,即widget程序如果还没有调用代码的updateWidget前显示的默认布局

layout/appwidget_provider

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/appwidget_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#ffff00ff"
    android:textColor="#ff000000"
/>

2 准备好AppWidgetProvider实现类
AppWidgetProvider的实现类
以广播为基础,回调通知AppWidget情况,比如更新,enable,disabled等通知

public class ExampleAppWidgetProvider extends AppWidgetProvider {

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        //省略
    }
    //省略
}

3 在manifest中进行注册

     <receiver android:name=".appwidget.ExampleAppWidgetProvider">
            <meta-data android:name="android.appwidget.provider"
                    android:resource="@xml/appwidget_provider" />
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
        </receiver>

meta-data标签也非常重要,它就是链接上了AppWidgetProviderInfo的xml

4 widget的ui通过代码更新方式

  static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
            int appWidgetId, String titlePrefix) {

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider);
        views.setTextViewText(R.id.appwidget_text, text);

        // Tell the widget manager
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

主要通过布局构建出对应的RemoteViews,然后对布局中的具体View进行相关set操作,最后调用appWidgetManager的updateAppWidget方法进行更新AppWidget

相关demo地址,需要下载aosp源码:
aosp/development/samples/ApiDemos/src/com/example/android/apis/appwidget/

widget展示在手机桌面的widget页面,因为前面的widget的manifest配置了,所以桌面才可以扫描展示出来:
在这里插入图片描述
拖动到桌面成功后widget显示如下:
在这里插入图片描述

6、Widget的显示Host进程详解

在aosp的CarLauncher中其实本身功能代码属于很简单,没有相关appwidget显示的需求点,但是是手机桌面是有完整的作为widgethost的代码部分。所以了解清除怎么作为一个WidgetHost就变得非常关键了。

需要

App widget host: The AppWidgetHost provides the interaction with the AppWidget service for apps that want to embed app widgets in their UI. An AppWidgetHost must have an ID that is unique within the host's own package. This ID remains persistent across all uses of the host. The ID is typically a hard-coded value that you assign in your application.

App widget ID: Each widget instance is assigned a unique ID at the time of binding (see bindAppWidgetIdIfAllowed(), covered in more detail in Binding widgets on this page. The unique ID is obtained by the host using allocateAppWidgetId(). This ID is persistent across the lifetime of the widget, that is, until it is deleted from the host. Any host-specific state (such as the size and location of the widget) should be persisted by the hosting package and associated with the app widget ID.

App widget host view: Think of AppWidgetHostView as a frame that the widget is wrapped in whenever it needs to be displayed. A widget is associated with an AppWidgetHostView every time the widget is inflated by the host. Note the following points:

By default, the system will create an AppWidgetHostView, but the host can create its own subclass of AppWidgetHostView by extending it.
Starting in Android 12 (API level 31), AppWidgetHostView introduces the the setColorResources() and resetColorResources() methods for handling dynamically overloaded colors. The host is responsible for providing the colors to these methods.

AppWidgetHost 负责和系统systemserver的AppWidget service进行相关的交互,每个AppWidgetHost需要有独立的id,也就意味者其实不仅仅只有桌面可以作为host,只是我们平常最常见是桌面,也代表可以有多个host同时显示widget
在这里插入图片描述

App widget ID代表每个App Widget实例都会有个独立的id,通过AppWidgetHost的allocateAppWidgetId的方法来获取,主要是在对widget进行binding时候需要这个id,就是bindAppWidgetIdIfAllowed方法需要这个id。

AppWidgetHostView
作为渲染widget的view,负责inflate widget的相关view

需要权限
BIND_APPWIDGET权限级别如下:
在这里插入图片描述需要有platform签名,或者属于内置priv/app才可以,这点其实CarLauncher一般都是满足的,一般都是platform签名和系统一样。

具体实战分析(参考aosp的源码demo:development/apps/WidgetPreview/src/com/android/widgetpreview/WidgetPreviewActivity.java):

  第一步,根据独特HOST_ID,构造出AppWidgetHost :
  mAppWidgetHost = new AppWidgetHost(getApplicationContext(), APPWIDGET_HOST_ID);
  第二步,AppWidgetHost 申请出独特的widget id:
  int id = mAppWidgetHost.allocateAppWidgetId();
  第三步,用申请的widget id绑定到对应的widget的provider的componentName:
  mAppWidgetManager.bindAppWidgetId(mAppWidgetId, intent.getComponent(), options);
  第四步,获取providerInfo,创建对应的AppWidgetHostView,进行add:
	 AppWidgetProviderInfo providerInfo =
            AppWidgetManager.getInstance(getBaseContext()).getAppWidgetInfo(appWidgetId);
mAppWidgetView = mAppWidgetHost.createView(getBaseContext(), appWidgetId, providerInfo);
mAppWidgetFrame.addView(mAppWidgetView, mPreviewWidth, mPreviewHeight);

在这里插入图片描述现象演示:
在这里插入图片描述

Android车机系统层在第三方导航应用内添加图标 一、背景 上篇文章 记一次进程fd文件句柄内存泄露排查_shusuanly的博客-优快云博客 中提到,系统方实现应用在前台的时候添加一个悬浮图标在应用之上,应用退出时取消浮窗。 悬浮窗方案存在如下缺点: 需要根据应用是否处于前台,进行控制显示与隐藏; 快速切换应用时无法做到同步显示,且增加系统计算压力; 复杂应用内存在多个层级的显示,悬浮窗始终显示在顶层,会遮挡部分显示。 二、分析 由于PhoneWindow是Window的唯一实现类,而每一个Activity都有一个Window即Phon 阅读详情

相关推荐

高通Camera PDAF调试实战:从Type2到Type3的避坑指南与Log分析技巧

本文深入解析高通Camera平台PDAF调试实战,重点对比Type2与Type3的核心差异,提供详细的配置迁移方案和Log分析技巧。针对常见兼容性问题如对焦速度变慢、低光失效等,给出具体解决方案,并分享性能优化案例与高级调试工具链,帮助开发者快速提升PDAF调试效率。

weixin_29164185的博客 413

深入Android Framework开发(入门篇)

广大的Android应用开发者是不是对Android系统充满着好奇,是不是很想学习Android系统开发,可惜自己学习难度又太大,本课程将手把手教你学Android Framework开发,带你走进Android系统开发的殿堂,全课程以实战为主,让你自己动手可以定制自己喜欢的Android系统,让你的Android职业道路越走越顺。 学完本课程能让你学会如下知识点: -学习Framework背景及它的巨大作用-Android源码环境搭建及让自己系统第一次跑起来-学习Frameowork开发的一些必要基础知识-学习怎么进行Android源码定位分析,实例:Activity启动流程源码分析-实战开发Frameowork项目--去除第三方应用入口广告页

SMPTE ST 2110 概论(三)

SMPTE ST 2110 概论(三)ST 2110-30:未压缩的PCM音频流ST 2110-31:非PCM音频传输ST 2110-40:辅助数据传输结语 ST 2110-30:未压缩的PCM音频流 鉴于音频系统是广播系统中最复杂,也是最重要的一套系统,我们先来回顾一下广电音频系统的历史。 最老式的音频都是基于模拟信号的,具有有限的动态范围,并且用连续的电压变化来描述音频。再后来就基于数字信号(...

Cidd0422的博客 1万+

aosp11/12/13 壁纸高斯模糊,毛玻璃SurfaceFlinger层面原理-第二节千里马framework实战

hi,粉丝朋友们!上一个blog已经详细讲解了系统中自带相关接口实现窗口的高斯模糊相关效果,具体点击这里。

learnframework的博客 1421

《QGIS快速入门与应用基础》010:下载过程中常见问题(如网速慢、文件损坏)

针对QGIS下载过程中的常见问题提供了系统解决方案。主要解决下载速度慢(≤100KB/s)和文件损坏两大核心问题:通过切换国内镜像源(如清华大学、阿里云)、使用专业下载工具提升速度;采用MD5/SHA256校验确保文件完整性,并排查存储介质和杀毒软件干扰。文章还包含macOS权限问题、Linux依赖缺失等高频问题的速解方案,并附详细的排查流程图和预防技巧,帮助用户顺利完成QGIS下载。后续将详细介绍安装流程,适合零基础用户参考。

LuckyHanMo的博客 482

YOLOv11【第二章:核心模块进阶篇·第3节】LDConv线性可变形卷积改进YOLOv11!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 7440

跟千里马学框架 遇到的坑

加一个临时的环境变量 : export ANDROID_PRODUCT_OUT=你自己的源码路径/out/target/product/generic_x86_64。在编译 aosp 的 所有的东西都是和他一样的, 但是出现了这个问题。首先你的 ubuntu 要开启虚拟机。明明所有的都是一样的但是出现了这个问题 , 啥情况。这里我们选择:6 –-- > aosp_x86_64。然后在进行 : emulator。

qq_26500807的博客 618

16、SQL Server索引的创建与评估

本文详细介绍了SQL Server中索引的创建与评估方法,涵盖索引的基本概念、类型(聚集与非聚集)、唯一性设置以及如何判断索引的好坏。通过实际操作步骤、维护策略和常见问题解决方案,帮助数据库开发者合理设计索引,提升查询性能并控制维护开销。同时提供了索引创建与维护的决策流程图,便于理解和应用。

water的专栏 126

车载桌面加入AppWidget小部件的支持-千里马车载车机android系统实战开发

即系统是否有开放FEATURE_APP_WIDGETS或者说有config_enableAppWidgetService配置为true,正常手机FEATURE_APP_WIDGETS是有的,config_enableAppWidgetService为false,也就是说手机上其实靠有FEATURE_APP_WIDGETS这个Feature,而车机上没有是因为没有FEATURE_APP_WIDGETS这个Feature。2选1即可以,这里我们选择简单一点的方案2,修改如下。如果系统有相关服务则有如下输出。

liaosongmao1的专栏 546

ATT MTU 交换机制:提升 BLE 数据传输效率的关键

在低功耗蓝牙(BLE)技术的面试中,ATT MTU 交换机制始终是高频考点。无论是芯片厂商的固件开发岗,还是物联网设备的协议栈调试岗,面试官都爱通过这个知识点考察候选人对 BLE 数据传输底层逻辑的理解。本文将系统梳理核心考点,结合历年真题详解应答思路,轻松应对这类问题。​

byte轻骑兵的技术小窝 2411

量子编程专业权威教程(十四):Shor 算法

本文系统阐述了Shor算法的原理与实现,重点解析了将大数分解问题转化为周期寻找问题的数论基础,以及模幂运算量子电路的设计方法。通过以N=15为例的完整算法流程演示,展示了量子计算在因数分解问题上的指数级优势。文章详细拆解了受控幺正操作构建、量子傅里叶变换应用等关键技术环节,并提供了可复现的Qiskit代码实现。同时指出了当前量子硬件在比特数、相干时间和错误率等方面面临的工程挑战,这些限制使得分解大整数仍需长期技术突破。该研究为理解量子计算优势提供了典型范例,对后量子密码学发展具有重要启示意义。

分享知识,拥抱变化 799

安卓权限参考

访问登记属性:android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取所处位置:android.permission.ACCESS_COARSE_LOCATION,通过WiFi或移动基站的方式获取用户所处的经纬度信息,定位精度大概误差30~1500米 获取精确位置: android.permiss...

dgflxcwno867930904的博客 352

linux驱动由浅入深系列:块设备驱动之一(高通eMMC分区实例)

linux驱动由浅入深系列:块设备驱动之一(高通eMMC分区实例)linux驱动由浅入深系列:块设备驱动之二(块设备驱动结构分析)块设备驱动的模型还是基本基于字符设备驱动的,可以简单理解为块设备仅仅增加了操作缓冲区,对用户请求顺序进行队列重拍等等。字符设备驱动的相关分析可以查看本博客相关的博文。 按照本博客的行文习惯,在具体分析块设备驱动代码之前,我们会从整体上了解一下研究对象的特征,以及用户空间...

Radia的专栏 1万+

从零开始学习Android Framework

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

逸寒 2341

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

android studio调试debug 系统framework、systemserver方法-千里马带你学framework

hi,粉丝朋友们大家好! 近来很多学员在说想要在android系统里面用android studio进行直接调试,针对这个需求其实我以前是确实有尝试的,包括前期破解鸿蒙系统和android关系时候也是有用到的。 下面我来给大家介绍一下怎么在android studio调试我们的framework代码: 1、首先肯定得搭建好源码的导入android studio,并且可以达到正常跳转的地步,这个部分可以看我之前的blog,或者看我的android framework入门课(可以加我qq:2102309716

liaosongmao1的专栏 1166

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android 打开第三方应用

文章内容转载于:https://www.jianshu.com/p/b17e1d31bbcf 在开发的过程中 有时候可能会需要进行应用之间的跳转 而跳转又分为显式意图和隐式意图 首先说一下显示意图和隐式意图的区别 显式意图: 明确指定组件名的Intent为显示意图,明确了Intent应该传递给那个组件。 隐式意图: 没有明确指定组件名的Intent为隐式意图。 显示意图多用于应用内到跳转 也就是我们平时用的跳转方式 而隐式意图多用于多用于应用间的跳转* 因为显示意图需要明确知道报名和类..

baipenggui_bo 895

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

千里马framework学习跨进程实战课程学员疑问解答:ClassNotFoundException when unmarshalling

hi,粉丝朋友们!

liaosongmao1的专栏 345

手把手教你做投屏AAC的详细介绍-千里马带你学framework

AAC(Advanced Audio Coding)是一种现代的音频编码技术,用于数字音频的传输和存储领域。AAC是MPEG-2和MPEG-4标准中的一部分,可提供更高质量的音频数据。AAC被认为是MP3的继任者。AAC比MP3的压缩率更高,压缩后的文件越小,二是保真性比MP3强。ACC最开始是基于MPEG-2的音频编码技术,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术。特点:更好的声音质量和更低的压缩比,减少了由于压缩而引入的失真和噪音。

learnframework的博客 1036

重大消息:手机车机互联投屏专题发布-千里马带你学框架

android投屏的使用场景以前在新能源车机还没火爆时候,大部分停留在手机小屏幕投屏到大屏幕的情况及整个多端设备的互动,整体需求和技术发展其实也就是比较有限,但是新能源车机火爆后,那么这种手机和车机互联互动的需求出现了爆发性增长,车机上各种创新类的交互都和这个手机车机之间的投屏有关系,因为手机的app生态和更新换代肯定比车机频繁,这样做好了手机车机互动投屏,可以让车机复用手机的强大功能。手机–>车机 --复用丰富的手机生态,和手机互动互联,弥补车机生态不足短板。├── 6-ByteBuffer的详细讲解。

learnframework的博客 1486

Android源码环境搭建(aosp Ubuntu 16.04 20.04)

Android源码环境搭建(aosp Ubuntu 16.04) 作者:千里马 课程要求: 电脑配置:双核,内存最少 16G,硬盘 200G 以上,独立安装 Ubuntu16.4 系统 学员要求:最少 1 年以上应用开发经验,推荐在 3 年左右 Android 应用开发经验, 熟悉 Java 语言,可以看懂 C/C++ 1、安装 ubuntu16.04(因为这个版本可以直接安装 openjdk-8,如果其他版本自行找方法) 2、openjdk 8 的安装 sudo apt-get install openj

learnframework的博客 2万+

【Android必备】构建一个App Widget主机(25)

原 概要 大多数Android设备上提供的Android主屏幕允许用户嵌入应用窗口小部件以快速访问内容。如果您正在构建Home替代品或类似的应用程序,则还可以通过实施一个允许用户嵌入应用程序小部件 AppWidgetHost。这不是大多数应用程序需要做的事情,但是如果您要创建自己的主机,了解主机默认同意的合同义务很重要。 本文件重点介绍实施习俗所涉及的责任 AppWidgetHost。有关如何实...

weixin_34232744的博客 250

Android车载Launcher开发(1) - 显示Widget

Android launcher开发,讲述如何显示其他app的widget到launcher上

NYSM239的博客 8533

千里马带你学framework:android 13 WM_SHELL_STARTING_WINDOW相关记录笔记

这里是为啥阿,因为高版本StartingWindow已经移殖到了Systemui进程,让Systemui来负责窗口创建相关,所以自然就wms端处理不了,要跨进程让systemui处理。这里注意,明显用wm开启时候,和正常wm相关的打印输出也是不一样的,明显显示是No IProtoLogGroup named WM_SHELL_STARTING_WINDOW。这个时候logcat -s WindowManager是没有这个shell相关打印,必须要。才可以打印出相关的Proto日志。

learnframework的博客 2307

API Guide:APP组件-应用小部件主机

大多数Android设备上提供的Android主屏幕允许用户嵌入应用程序小部件以快速访问内容。如果您正在建立一个主配件或类似的应用程序,那么你还可以允许用户通过实施AppWidgetHost来嵌入应用程序小部件。这不是大多数应用程序需要做的事情,但如果您正在创建自己的主机,请务必了解主机隐含地同意的合同义务。 本文档重点介绍实现自定义AppWidgetHost所涉及的职责。 有关如何实现

一世豁然的专栏 806

android使用系统隐藏接口ActivityView实现主界面分窗显示三方应用Activity

android系统隐藏API介绍android.app.ActivityView frameworks\base\core\java\android\app /packages/apps/Car/Launcher/src/com/android/car/carlauncher/ https://source.android.google.cn/devices/automotive?hl=zh-cn

分享技术与经验的博客 1万+
上一篇: 上滑动导航栏手势桌面最近任务可见解密-千里马手把手带你搞定framework车载车机系统开发
下一篇: 车载桌面加入AppWidget小部件的支持-千里马车载车机android系统实战开发
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值