Android widget基础指南

widget的概念最早是由一名叫Rose的苹果工程师提出,后来经过多方面机缘巧合的发展下,便有了今天Android平台上的小组件widget,一般APP开发可能应用场景较少,最常见的莫过于天气APP的widget。但对于从事IOT或车载方向的同学,定制化Launcher涉及修改的widget的相关业务则可能不少。

Android widget,即桌面插件,如下图红框所选中皆是插件:

image.gif

其启动、加载运行流程全在Launcher中,其实现细节我们可以不关注(如果想了解需翻阅Launcher源码),只需要了解如何使用即可。实现步骤如下:

1、创建布局

在res/layout/目录中创建相应布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="200dp"android:background="#cca"><ImageViewandroid:id="@+id/icon"android:layout_width="60dp"android:layout_height="60dp"android:layout_centerInParent="true"android:src="@drawable/ic_launcher_round"/><TextViewandroid:id="@+id/tv_widget"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/icon"android:text="123"android:layout_centerHorizontal="true"/></RelativeLayout>

这里要注意的是,widget中并不支持所有布局控件,目前所支持的布局如下:

FrameLayout
LinearLayout
RelativeLayout
GridLayout

所支持的控件如下:

AnalogClock
Button
Chronometer
ImageButton
ImageView
ProgressBar
TextView
ViewFlipper
ListView
GridView
StackView
AdapterViewFlipper

不支持自定义View、这些类的子类,以及包括RecyclerView在内的其他没有声明的控件(是的,这些都不支持)。

2、创建配置文件

在res/xml/目录中创建相应文件:

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"android:minHeight="180dp"android:minWidth="300dp"android:previewImage="@drawable/ic_launcher_background"android:initialLayout="@layout/layout_widget_info"android:updatePeriodMillis="10000"android:resizeMode="horizontal|vertical"android:widgetCategory="home_screen"></appwidget-provider>

其各参数含义如下:
·minWidth 、 minHeight:widget的最小宽、高,在Launcher上,widget可以通过拉伸宽高来改变尺寸大小。

·previewImage:添加widget前的预览图片。

·initialLayout:widget所使用的布局。

·updatePeriodMillis:widget更新周期时间。(在 1.6 以后的版本中,Google从省电的角度规定,当 updatePeriodMillis 设置的值小于30min时,就会失效。也就是通过设置这个属性值,最短的更新间隔是30min。)

·resizeMode:widget尺寸调整规格、拉伸方向,“horizontal"代表可以水平拉伸,“vertical”代表可以竖向拉伸,“none”代表不能拉伸;默认为"none”。

·widgetCategory:widget的显示区域,“home_screen” 或 “keyguard”。

3、创建AppWidgetProvider

widget的功能都是通过AppWidgetProvider实现的,先继承此类然后复写相关方法,例如:

public class MainWidgetProvider extends AppWidgetProvider {@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {super.onUpdate(context, appWidgetManager, appWidgetIds);}@Overridepublic void onEnabled(Context context) {super.onEnabled(context);}@Overridepublic void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);}@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {super.onDeleted(context, appWidgetIds);}@Overridepublic void onDisabled(Context context) {super.onDisabled(context);}@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);}
}

其个参数含义如下:

·onUpdate():用户添加widget时,或者根据updatePeriodMillis定义的刷新时间到了的时候,会调用此函数刷新,可以在此函数里进行部分初始化刷新业务,也可以在这里设置点击事件等。

·onEnabled():widget第一次被添加时调用,比如用户添加widget后再删除再添加一次,只有第一次添加的时候会回调。

·onDisabled():当最后一个widget在Launcher桌面上被移除后调用,这时候适合做一些数据重置归零业务。

·onReceive():广播接收时调用。

·onAppWidgetOptionsChanged():widget 第一次添加或者拉伸等引起大小尺寸发生变化时调用该方法

·onDeleted():小插件被移除时会调用。(亲测不是所有机型都有效)

这里面最常使用的也就是onUpdate()和onReceive()了。

4、在AndroidManifest.xml中添加相关信息

我们观察下AppWidgetProvider的源码,会发现这其实就是个广播类:

image.gif

因此,我们的MainWidgetProvider 在清单文件中也要以广播的形式注册:

<receiverandroid:name=".MainWidgetProvider"android:label="小组件"><intent-filter><action android:name="android.appwidget.action.APPWIDGET_UPDATE" /></intent-filter><meta-dataandroid:name="android.appwidget.provider"android:resource="@xml/widget_provider" />
</receiver>

这里的android.appwidget.action.APPWIDGET_UPDATE 动作的广播是所有widget都会接受到的广播,该广播根据android:updatePeriodMillis设定的间隔时间发出广播,用于定时更新桌面上的所有窗口小部件(部分机型可能无效)。resource指定xml 目录下widget对应的布局文件。

其效果(长按桌面,选择自己的小组件长按拖拽到桌面的过程)如下:

widget-demo.gif

总结

widget所有流程基本上全在这里了,其余业务逻辑流程这里不再赘述。widget在部分机型上还拥有保活的功效(比如OV,没升鸿蒙之前的华为等),当然,你也有可能会发现在某些机型上部分API会失效,因为控制这部分API的Launcher是各大厂商必改的apk之一,如果想刷新widget,还是得通过广播的形式,同时注意进程的存活状态,但是考虑到很多方法不一定会生效,建议相关逻辑处理放到Service中。

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

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

相关文章

C 练习实例71-结构体

题目&#xff1a;编写input()和output()函数输入&#xff0c;输出5个学生的数据记录。 代码&#xff1a; #include <stdio.h> typedef struct{char name[20];char sex[2];int age; }student; //定义了一种新的数据类型&#xff0c;叫做&#xff1a;student void input(…

WebRTC最新版报错解决:FileNotFoundError: LASTCHANGE.committime (二十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

图形渲染基础学习

原文链接&#xff1a;游戏开发入门&#xff08;三&#xff09;图形渲染_如果一个面只有三个像素进行渲染可以理解为是定点渲染吗?-CSDN博客 游戏开发入门&#xff08;三&#xff09;图形渲染笔记&#xff1a; 渲染一般分为离线渲染与实时渲染&#xff0c;游戏中我们用的都是…

【Linux取经路】文件系统之重定向的实现原理

文章目录 一、再来理解重定向1.1 输出重定向效果演示1.2 重定向的原理1.3 dup21.4 输入重定向效果演示1.5 输入重定向代码实现 二、再来理解标准输出和标准错误2.1 同时对标准输出和标准错误进行重定向2.2 将标准输出和标准错误重定向到同一个文件 三、再看一切皆文件四、结语 …

书生开源大模型训练营-第3讲笔记

5.Langchain和InternLM搭建知识库 5.1环境 还是一样&#xff0c;开发机中创建镜像&#xff0c;以及所需依赖 pip install modelscope1.9.5 pip install transformers4.35.2 pip install streamlit1.24.0 pip install sentencepiece0.1.99 pip install accelerate0.24.15.2模…

python之GIL

GIL&#xff08;global interpreter lock&#xff09;&#xff0c;即全局解释器锁 在单核时代&#xff0c;崇尚优美、清晰、简单的 Python 之父选择在解释器层面实现了一把全局互斥锁&#xff0c;来保护 Python 对象从而实现对单核 CPU 的使用率&#xff0c;这种做法在单核时代…

git操作(二)

之前我们对于git已经有了一定的了解&#xff0c;现在我们学习一些关于git的新内容。 一.修改⽂件 首先&#xff0c;我们先来认识一个命令&#xff1a; git status //⽤于查看在你上次提交之后是否有对⽂件进⾏再次修改,注意指的是仓库和工作区对比 关于三区的内容&#xff…

如何有效利用API接口进行数据采集

在当今数字化的世界中&#xff0c;API&#xff08;应用程序编程接口&#xff09;作为数据交换的桥梁&#xff0c;对于电商企业来说尤为重要。它们允许企业从丰富的数据源中提取必要的信息&#xff0c;为商业决策提供数据支持。本文将围绕如何高效地利用API进行数据采集展开讨论…

实际生产中的一次非典型的基于jmeter的接口自动化实践

实际工作中遇到过一次自动化巡检的需求&#xff0c;作为测试人员没法从源代码入手&#xff0c;加之数据库也不熟悉&#xff0c;故采取接口自动化的方式来实现巡检&#xff0c;算是一种歪门邪道吧&#xff0c;应该不是接口自动化的常规使用方式。jmeter在这里的作用实际上也只是…

docker安装一系列镜像

启动docker systemctl start docker docker 启动已经停止的容器 docker start idOrName PS&#xff1a;idOrName为容器的id或者名称 1、安装mysql镜像 拉取mysql5.7的镜像 docker pull mysql:5.7 查看镜像 docker images 启动mysql #启动mysql docker run --name mysql…

云呐电网智能运维包含哪些?智能运维都有哪些框架

电网智能运维是一个复杂的系统&#xff0c;包括多种技术和方法&#xff0c;为提升电力系统的效率和稳定性。以下是你提出的问题的实际答案: 网络智能运维的核心技术与应用&#xff1a; 故障检测&#xff1a;根据实时监测和数据分析&#xff0c;对电网中的故障进行快速、准确的…

C++递归复习3

输出n~1的整数 #include<bits/stdc.h> using namespace std; int n; void f(int); int main() {cin>>n;f(n);return 0; } void f(int n){if(n0) return;cout<<n<<endl;f(n-1); }求10097......41的值 #include<bits/stdc.h> using namespace st…

k8s容器以及基础设施优化

1.硬件系统选型&#xff1a;宿主机通用配置16c/32GB/4网卡队列 2.os优化&#xff1a;单机支持百万tcp并发&#xff0c;/etc/sysctl.conf,/etc/security/limits.conf 3.k8s&容器层优化&#xff1a;性能优化initContainer 4.kube-dns优化&#xff1a;增大--cache-size,设置…

LabVIEW读取excel日期

LabVIEW读取excel日期 | Excel数据表格中有日期列和时间列&#xff0c;如下表所示&#xff1a; 通过LabVIEW直接读取Excel表格数据&#xff0c;读出的日期列和时间列数据与原始表格不一致&#xff0c;直接读出来的数据如下表所示&#xff1a; 日期、时间列数据异常 问题产生原因…

VBA:批量复制sheet内指定内容

VBA. 批量复制sheet内指定内容 背景&#xff1a;一个excel内有包含0-18序号的Sheet&#xff0c;需要将1-18的sheet内包含标准差的行复制到sheet”0“中。 方法&#xff1a; 从1-18遍历sheet&#xff0c;找到单元格值为”标准差“的行&#xff0c;然后&#xff08;仅复制值&a…

docker安装milvus后,无法打开attu,日志报错

背景&#xff0c;在虚拟机用docker安装milvus后&#xff0c;正常访问attu&#xff0c;过段时间挂机后无法访问 日志报错&#xff1a; [2024/02/19 06:59:46.761 00:00] [ERROR] [grpcclient/client.go:330] ["ClientBase ReCall grpc second call get error"] [rol…

ThreadLocal(4):ThreadLocal的核心方法源码

基于ThreadLocal的内部结构&#xff0c;我们继续分析它的核心方法源码&#xff0c;更深入的了解其操作原理。 除了构造方法之外&#xff0c; ThreadLocal对外暴露的方法有以下4个&#xff1a; 方法声明描述protected T initialValue()返回当前线程局部变量的初始值public voi…

Linux下多核CPU指定程序运行的核

设置程序在指定CPU核心运行 一、如何查看程序运行的CPU信息 1.1 查看当前系统CPU有几个核心 查看CPU核心数量&#xff1a;lscpu 1.2 查看程序的PID ps aux|grep cpu_test1.3 查看程序可运行的CPU taskset -c -p pid1.4 设置程序在指定核心上运行 1.4.1 通过运行时的参数设…

C语言代码 递归实现n的k次方

递归实现n的k次方 代码示例&#xff1a; #include <stdio.h>double Pow(int n, int k) {if (k > 0){return n * Pow(n, k - 1);}else if (0 k){return 1;}else{return 1.0 / pow(n, -k);} } int main() {int n 0;int k 0;scanf("%d %d", &n, &…

[工具探索]VSCode介绍和进阶使用

相比较GoLand、PhpStorm、PyCharm、WebStorm的重量级内存占用&#xff0c;从Windows系统来&#xff0c;各种卡死&#xff0c;换到MacOS倒不会卡死&#xff0c;但是内存占用太多&#xff0c;影响体验&#xff0c;决定换到VSCode。当然这个过程需要适应过渡期&#xff0c;旧伙计都…