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);

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/127839.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是Linux

什么是Linux&#xff1f; 不知道大家是什么时候开始接触Linux&#xff0c;我记得我是大三的时候&#xff0c;那时候通过国嵌、韦东山的教学视频&#xff0c;跟着搭bootloader&#xff0c;修改内核&#xff0c;制作根文件系统&#xff0c;一步步&#xff0c;视频真的很简单&…

GRU门控循环单元

GRU 视频链接 https://www.bilibili.com/video/BV1Pk4y177Xg?p23&spm_id_frompageDriver&vd_source3b42b36e44d271f58e90f86679d77db7Zt—更新门 Rt—重置门 控制保存之前一层信息多&#xff0c;还是保留当前神经元得到的隐藏层的信息多。 Bi-GRU GRU比LSTM参数少 …

大数据Flink(七十四):SQL的滑动窗口(HOP)

文章目录 SQL的滑动窗口(HOP) SQL的滑动窗口(HOP) 滑动窗口定义:滑动窗口也是将元素指定给固定长度的窗口。与滚动窗口功能一样,也有窗口大小的概念。不一样的地方在于,滑动窗口有另一个参数控制窗口计算的频率(滑动窗口滑动的步长)。因此,如果滑动的步长小于窗口大…

10.Xaml ListBox控件

1.运行界面 2.运行源码 a.Xaml 源码 <Grid Name="Grid1"><!--IsSelected="True" 表示选中--><ListBox x:Name="listBo

0003号因子测试结果、代码和数据

这篇文章共分为四个部分:第一个部分是因子测试结果,第二个部分是因子逻辑,第三个部分是因子代码,第四个部分是整个因子测试用的数据、代码、分析结果的下载地址。 因子测试结果: 因子描述 因子属性-量价因子因子构建:计算成交量的变化率和日振幅率,计算两者在过去一定…

LASSO回归

LASSO回归 LASSO(Least Absolute Shrinkage and Selection Operator&#xff0c;最小绝对值收敛和选择算子算法)是一种回归分析技术&#xff0c;用于变量选择和正则化。它由Robert Tibshirani于1996年提出&#xff0c;作为传统最小二乘回归方法的替代品。 损失函数 1.线性回…

MySQL学习5:事务、存储引擎

事务 简介 事务是一组数据库操作的执行单元&#xff0c;它要么完全执行&#xff0c;要么完全不执行。事务是确保数据库中的数据一致性和完整性的重要机制之一。 事务具有以下四个特性&#xff08;称为ACID特性&#xff09;&#xff1a; 原子性&#xff08;Atomicity&#xf…

将 ordinals 与 比特币智能合约集成 : 第 1 部分

将序数与比特币智能合约集成&#xff1a;第 1 部分 最近&#xff0c;比特币序数在区块链领域引起了广泛关注。 据称&#xff0c;与以太坊 ERC-721 等其他代币标准相比&#xff0c;Ordinals 的一个主要缺点是缺乏对智能合约的支持。 我们展示了如何向 Ordinals 添加智能合约功…

Spring Boot 中使用 Poi-tl 渲染数据并生成 Word 文档

本文 Demo 已收录到 demo-for-all-in-java 项目中&#xff0c;欢迎大家 star 支持&#xff01;后续将持续更新&#xff01; 前言 产品经理急冲冲地走了过来。「现在需要将按这些数据生成一个 Word 报告文档&#xff0c;你来安排下」 项目中有这么一个需求&#xff0c;需要将用户…

MySQL——主从复制

简介 在实际的生产中&#xff0c;为了解决Mysql的单点故障已经提高MySQL的整体服务性能&#xff0c;一般都会采用「主从复制」。 主从复制开始前有个前提条件&#xff1a;两边的数据要一样&#xff0c;主必须开启二进制日志 dump thread 线程 基于位置点从是否需要开启二进…

Codeforces Round 895 (Div. 3)

Codeforces Round 895 (Div. 3) A. Two Vessels 思路&#xff1a; 我们可以发现当在 a 拿 c 到 b 其实可以让他们差值减少 2c&#xff0c;所以对a和b的差值除以2c向上取整即可 #include<bits/stdc.h> using namespace std; #define int long long #define rep(i,a,n) …

烟感报警器单片机方案开发,解决方案

烟感报警器也叫做烟雾报警器。烟感报警器适用于火灾发生时有大量烟雾&#xff0c;而正常情况下无烟的场所。例如写字楼、医院、学校、博物馆等场所。烟感报警器一般安装于所需要保护或探测区域的天花板上&#xff0c;因火灾中烟雾比空气轻&#xff0c;更容易向上飘散&#xff0…

如何利用 Selenium 对已打开的浏览器进行爬虫

大家好&#xff01; 在对某些网站进行爬虫时&#xff0c;如果该网站做了限制&#xff0c;必须完成登录才能展示数据&#xff0c;而且只能通过短信验证码才能登录 这时候&#xff0c;我们可以通过一个已经开启的浏览器完成登录&#xff0c;然后利用程序继续操作这个浏览器&…

Redis常见命令

命令可以查看的文档 http://doc.redisfans.com/ https://redis.io/commands/ 官方文档&#xff08;英文&#xff09; http://www.redis.cn/commands.html 中文 https://redis.com.cn/commands.html 个人推荐这个 https://try.redis.io/ redis命令在线测试工具 https://githubfa…

《向量数据库》——向量数据库Milvus 和大模型出联名款AI原生Milvus Cloud

大模型技术的发展正加速对千行百业的改革和重塑,向量数据库作为大模型的海量记忆体、云计算作为大模型的大算力平台,是大模型走向行业的基石。而电商行业因其高度的数字化程度,成为打磨大模型的绝佳“战场”。 在此背景下,Zilliz 联合亚马逊云科技举办的【向量数据库 X 云计…

在FPGA上快速搭建以太网

在本文中&#xff0c;我们将介绍如何在FPGA上快速搭建以太网 &#xff08;LWIP &#xff09;。为此&#xff0c;我们将使用 MicroBlaze 作为主 CPU 运行其应用程序。 LWIP 是使用裸机设计以太网的良好起点&#xff0c;在此基础上我们可以轻松调整软件应用程序以提供更详细的应用…

Chrome 108版(64-bit 108.0.5359.125)网盘下载

还在用Selenium的朋友们注意了&#xff0c;目前Chrome的最新版是116&#xff0c;而官方的Chromedriver只支持到115版。 可惜Google不提供旧版Chrome的下载方式&#xff0c;需要旧版的很难回去了。如果真的想要旧版的Chrome&#xff0c;只能民间自救。 我在2022年12月备份了C盘…

线性代数的学习和整理21,向量的模,矩阵的模,矩阵的模和行列式比较(未完成)

目录 1 模的定义 2 向量的模是距离 2.1 向量的模的定义 2.2 向量的模的计算公式 3 矩阵的模 3.1 矩阵/向量组的模的定义 3.2 矩阵的模的公式 4 矩阵的模和行列式的关系&#xff1f; 1 模的定义 模&#xff0c;又称为范数。范数&#xff0c;是具有“长度”概念的函数。…

机器人任务挖掘与智能超级自动化技术解析

本文为上海财经大学教授、安徽财经大学学术副校长何贤杰出席“会计科技Acctech应对不确定性挑战”高峰论坛时的演讲内容整理。何贤杰详细介绍了机器人任务挖掘与智能超级自动化技术的发展背景、关键技术和应用场景。 从本质来说&#xff0c;会计是非常适合智能化、自动化的。会…

ROS2下使用TurtleBot3-->SLAM导航(仿真)RVIZ加载不出机器人模型

一、问题描述 在使用台式机进行仿真时&#xff0c;大部分例程很顺利&#xff0c;但在SLAM导航时&#xff0c;在RVIZ中却一直加载不出机器人模型&#xff0c;点击Navigation2 Goal选择目标点进行导航时&#xff0c;无响应。 启动后在RVIZ2和终端看到一个错误 按照官网的指令试…