当前位置: 首页 > news >正文

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

官网参考链接: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 {@Overridepublic 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 managerappWidgetManager.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 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程

官网参考链接&#xff1a;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…...

如何使用CSS画一个三角形

原理&#xff1a;其实就是规定元素的四个边框颜色及边框宽度&#xff0c;将元素宽高设置为0。如果要哪个方向的三角形&#xff0c;将对应其他三个方向的边框宽和颜色设置为0和透明transparent即可 1.元素设置边框&#xff0c;宽高&#xff0c;背景色 <style>.border {w…...

第15章_锁: (表级锁、页级锁、行锁、悲观锁、乐观锁、全局锁、死锁)

3.2 从数据操作的粒度划分&#xff1a;表级锁、页级锁、行锁 为了提高数据库并发度&#xff0c;每次锁定的数据范围越小越好&#xff0c;理论上每次只锁定当前操作的数据的方案会得到最大的并发度&#xff0c;但管理锁是很耗资源&#xff08;涉及获取、检查、释放锁等动作)。因…...

python音频转文字调用baidu

python音频转文字调用的是百度智能云的接口&#xff0c;因业务需求会涉及比较多数字&#xff0c;所以这里做了数字的处理&#xff0c;可根据自己的需求修改。 from flask import Flask, request, jsonify import requestsfrom flask_limiter import Limiterapp Flask(__name_…...

靶场溯源第二题

关卡描述&#xff1a;1. 网站后台登陆地址是多少&#xff1f;&#xff08;相对路径&#xff09; 首先这种确定的网站访问的都是http或者https协议&#xff0c;搜索http看看。关于http的就这两个信息&#xff0c;然后172.16.60.199出现最多&#xff0c;先过滤这个ip看看 这个很…...

mysql 的增删改查以及模糊查询、字符集语句的使用

一、mysql启动与登陆(windows下的mysql操作) 1.启动mysql服务 net start mysql81 2.登陆mysql mysql -uroot -p 3.查看所有数据库 show databases; 二、模糊查询&#xff08;like&#xff09; 1. _代表查询单个 2.%代表查询多个 3.查找所有含有schema的数据库&#xff1b;…...

Python Django框架中文教程:学习简单、灵活、高效的Web应用程序框架

概述: Python Django是一种流行的Web应用程序框架&#xff0c;被广泛应用于开发高效、可扩展的网站和Web应用程序。Django以其简单、灵活和高效而受到开发者们的青睐。它提供了强大的工具和功能&#xff0c;使开发过程更加容易和高效。 Django的主要目标是帮助开发者快速构建…...

Docker认识即安装

Docker及相关概念 Docker和虚拟机方式的区别&#xff1a;虚拟机技术是虚拟出一套硬件后&#xff0c;在其上运行一个完整的操作系统&#xff0c;在该系统上在运行所需应用进程&#xff1b;而容器内的应用进程是直接运行于宿主的内核&#xff0c;容器内没有自己的内核&#xff0…...

chrome 谷歌浏览器 导出插件拓展和导入插件拓展

给同事部署 微软 RPA时&#xff0c;需要用到对应的chrome浏览器插件&#xff1b;谷歌浏览器没有外网是不能直接下载拓展弄了半小时后才弄好&#xff0c;竟发现没有现成的教程&#xff0c;遂补充&#xff1b; 如何打包导出 谷歌浏览器 地址栏敲 chrome://extensions/在对应的地…...

fastjson漏洞批量检测工具

JsonExp 简介 版本&#xff1a;1.3.5 1. 根据现有payload&#xff0c;检测目标是否存在fastjson或jackson漏洞&#xff08;工具仅用于检测漏洞&#xff09;2. 若存在漏洞&#xff0c;可根据对应payload进行后渗透利用3. 若出现新的漏洞时&#xff0c;可将最新的payload新增至…...

Vue进阶(六十七)页面刷新路由传参丢失问题分析及解决

文章目录 一、前言二、问题排查三、延伸阅读3.1 Apache服务器access_log日志3.2 浏览器的常见User Agent 各字段的解释 一、前言 问题描述&#xff1a;Vue项目上线后&#xff0c;在IE浏览器上&#xff0c;从A页面跳转至B页面&#xff0c;B页面通过data中接收来自A页面的参数信…...

阿里云ubuntu服务器搭建ftp服务器

阿里云ubuntu服务器搭建ftp服务器 服务器环境安装步骤一.创建用户二.安装 vsftp三 配置vsftp四.配置阿里云安全组 服务器环境 阿里云上的云服务器&#xff0c;操作系统为 ubuntu20.04。 安装步骤 一.创建用户 为什么需要创建用户&#xff1f; 这里的用户&#xff0c;指的是…...

03 卷积操作图片

一、均值滤波 # 卷积操作 # 输入图片. input, 必须是4维tensor(图片数量, 图片高度, 图片的宽度, 图片的通道数) # filters, 卷积核, 必须是4维的tensor(卷积核的高度和宽度, 输入图片的通道数, 卷积核的个数) # strides, 步长, 卷积核在图片的各个维度上的移动步长, (1, 1, 1,…...

软考:中级软件设计师:程序语言基础:表达式,标准分类,法律法规,程序语言特点,函数传值传址

软考&#xff1a;中级软件设计师:程序语言基础&#xff1a;表达式 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都…...

Java“牵手”1688商品详情数据,1688商品详情API接口,1688API接口申请指南

1688平台商品详情接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取1688商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口&#xff0c;通过…...

stable diffusion实践操作-批次出图

系列文章目录 stable diffusion实践操作 文章目录 系列文章目录前言一、批次出图介绍1.1 webUI设置1.2 参数介绍 二、批次出图使用2.1 如何设置2.1 效果展示 总结 前言 本章主要介绍SD批次出图。 想要一次产生多张图片的时候使用。 一、批次出图介绍 1.1 webUI设置 1.2 参数…...

LeetCode热题100 【cpp】题解(一)哈希表和双指针

文章目录 1. 两数之和49. 字母异位词分组128. 最长连续序列283. 移动零11. 盛最多水的容器15. 三数之和42. 接雨水 题单链接&#xff1a; LeetCode 热题 100 1. 两数之和 leetcode题目链接 题解1&#xff1a;暴力枚举 时间复杂度&#xff1a; O ( n 2 ) O(n^2) O(n2) class …...

Python爬虫常见代理池实现和优化

在这篇文章中&#xff0c;我们将探讨Python爬虫中常见的代理池实现和优化方法。在爬取网站数据时&#xff0c;为防止被目标网站封禁IP&#xff0c;我们通常会使用代理IP进行访问。一个高效且稳定的代理池可以帮助我们轻松应对各种反爬策略。   首先&#xff0c;我们来了解一下…...

前端面试的话术集锦第 3 篇:进阶篇上

这是记录前端面试的话术集锦第三篇博文——进阶篇上,我会不断更新前端面试话术的博文。❗❗❗ 1 谈谈变量提升 当执⾏JS代码时,会⽣成执⾏环境,只要代码不是写在函数中的,就是在全局执⾏环境中,函数中的代码会产⽣函数执⾏环境,只此两种执⾏环境。 b() // call b conso…...

【文字到语音的论文总结】

1.文字到语音的整个过程 文字到语音的一般整体结构 主要是下面这个流程&#xff0c;每个网络可能会把其中两者或是三者融合在一起来&#xff1b; 长度不同的问题 生成的语音可能和文字的长度并不一样&#xff0c;因此需要解决这个问题 Tactron使用的是交叉注意力的方式解…...

OpenLayers飞机航线动画实战:如何让SVG图标随航线动态转向(附完整代码)

OpenLayers飞机航线动画实战&#xff1a;SVG图标动态转向与轨迹平滑渲染技术解析 在航空监控、物流追踪等地理信息系统中&#xff0c;飞机或运输工具的实时轨迹展示一直是核心需求。传统静态路径显示已无法满足现代交互需求&#xff0c;如何实现图标随航线动态转向的平滑动画成…...

你还在用StreamingResponse硬扛LLM流式?FastAPI 2.0全新AsyncIteratorResponse实践已落地金融级AI客服(限前500名获取迁移checklist)

第一章&#xff1a;FastAPI 2.0异步流式响应的核心演进与金融级落地价值FastAPI 2.0 将 StreamingResponse 的底层调度机制从 ASGI 的同步迭代器封装&#xff0c;全面升级为原生协程驱动的异步生成器&#xff08;async def ... yield&#xff09;&#xff0c;彻底消除事件循环阻…...

OpenClaw多模态扩展:结合百川2-13B-4bits与OCR的图像信息处理流程

OpenClaw多模态扩展&#xff1a;结合百川2-13B-4bits与OCR的图像信息处理流程 1. 为什么需要多模态能力扩展&#xff1f; 上周我需要整理一批技术文档的截图&#xff0c;包含代码片段、错误日志和流程图。手动转录不仅耗时&#xff0c;还容易出错。这让我开始思考&#xff1a…...

DAMOYOLO-S基础教程:理解count字段与实际业务中目标计数逻辑映射

DAMOYOLO-S基础教程&#xff1a;理解count字段与实际业务中目标计数逻辑映射 1. 从一次“数数”的困惑说起 前两天&#xff0c;一个做零售分析的朋友找我帮忙。他兴奋地告诉我&#xff0c;他们用上了最新的AI目标检测模型&#xff0c;想自动统计货架上的商品数量。他上传了一…...

WaveTools鸣潮工具箱终极指南:画质优化与抽卡分析的完整解决方案

WaveTools鸣潮工具箱终极指南&#xff1a;画质优化与抽卡分析的完整解决方案 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools鸣潮工具箱是一款专为《鸣潮》玩家设计的强大辅助工具&#xff0c;它…...

Unity游戏模组革命:MelonLoader新手10分钟完全指南

Unity游戏模组革命&#xff1a;MelonLoader新手10分钟完全指南 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 你是否想过为喜爱…...

YOLOv12镜像实战:工业质检场景下的高精度缺陷识别方案

YOLOv12镜像实战&#xff1a;工业质检场景下的高精度缺陷识别方案 1. 工业质检的挑战与YOLOv12的机遇 在制造业数字化转型浪潮中&#xff0c;工业质检一直是自动化程度较低的环节。传统人工检测面临三大痛点&#xff1a; 效率瓶颈&#xff1a;熟练质检员每分钟最多检测20-30…...

Youtu-VL-4B-Instruct步骤详解:Supervisor日志查看、错误定位与常见启动失败修复

Youtu-VL-4B-Instruct步骤详解&#xff1a;Supervisor日志查看、错误定位与常见启动失败修复 部署一个强大的多模态AI模型&#xff0c;最让人头疼的往往不是使用&#xff0c;而是启动。你满怀期待地拉取镜像、启动服务&#xff0c;结果浏览器里只显示一个冰冷的“无法访问此网…...

QtPlaskin实战指南:从HDF5数据解析到等离子体动力学可视化

1. QtPlaskin与等离子体动力学分析入门 第一次接触QtPlaskin时&#xff0c;我被它处理复杂等离子体数据的能力惊艳到了。这个基于Python和Qt开发的图形工具&#xff0c;专门用于解析ZDPlasKin等等离子体动力学程序生成的HDF5格式数据。想象一下&#xff0c;你刚完成了一个长达…...

【进阶指南】VSCode + Clang-Format:从零定制你的专属代码风格(130+配置项实战解析)

1. 为什么需要定制代码风格&#xff1f; 当你第一次接触代码格式化工具时&#xff0c;可能会觉得默认配置已经足够好用。但当你参与过几个团队项目后&#xff0c;就会发现统一的代码风格有多重要。我曾经接手过一个遗留项目&#xff0c;里面混杂着五种不同的缩进风格——有用制…...