废话

桌面小组件,绝对是小程序中的小程序,说白了就是任何复杂一丁点的操作都不适合做成桌面小组件。

所以这里采用的演示的例子,就只有一个白色圆角背景,外加一个文本框,显示文字。

小组件的教程网上一搜一大堆,所以我这里主要就是介绍一些坑的地方,跟大致处理流程,具体细节还得看其他大神的骚操作。

预览图

注意事项

1、UI 适配

小组件的宽高是可以支持用户自行调整的,只需简单的设置最低宽高,但是可调整的最小粒度是根据手机的 icon 为标准,这样就会导致一个比较难处理的点。

如果手机是 4x 布局的,即一行可以显示 4 个 APP 图标,那调节的粒度就是 90dp(理想情况下),实际情况的话,还得考虑小组件的固定边距,这个边距,不同牌子的手机可能还不一样。

如果手机是 5x 布局的,即一行可以显示 5 个 APP 图标……

解决方案:小组件数量无限制,用户也是用就加不用就不加,所以解决方案就简单粗暴一点,你能想到的适配尺寸,每种尺寸搞一个,用户自己选择合适的尺寸就好。大、中、小、大中、中小、微小、超大等乱七八糟的,全部一股脑上。

2、更新时间

更新时间为主动更新和定时更新;

主动更新:即在 APP 中可以动态更新这个桌面小组件,这种情况更新没有时间限制。

定时更新:小组件需要展示的数据可能已经发生了变化,但是 APP 已经被系统杀死了,无法主动更新数据,就会导致小组件展示的数据可能是已过期的或者是旧的,这时候就可以用到小组件的定时更新功能,但是这个定时更新有一个限制,基于省电逻辑,最快的更新周期为 30 分钟。(如果是再 onUpdate 方法中写个定时器定时更新,抱歉,不行,会被系统杀死,杀死之后小组件不会消失,而是一直显示最后一次更新时候的状态,直到下一次更新数据,类似于电子水墨屏的逻辑。)

3、点击事件

我这里图省事,只用了最简单的,点击整个小组件直接调起 APP,所以其他复杂一点的点击事件的处理方法我就不懂了。

点击跳转页面需要用到 PendingIntent,这玩意的 Flag 有很多种模式,具体可以查看文章底部的参考文档,坑就坑在这个 Flag,31 之后的系统有改动,会报错,所以 31 的系统需要用 PendingIntent.FLAG_IMMUTABLE,具体看代码。

4、调起 APP

通过 PendingIntent 就可以直接调起 APP 的相关页面,不过这里也有坑,假设你 APP 的启动页面是 MainActivity 页面,点击小组件你就让它跳转到 MainActivity 页面走正常的 APP 启动流程,就等同于是点击小组件就能启动 APP,哪怕 APP 被杀死了,也不影响启动(听着好像没毛病)。

坑就坑在于,通过这种方式打开的 APP,他…… 他不走 Application 类,也就是你如果是在 Application 中初始化了某些东西,但是 APP 已经被系统杀死了,这时候你再点击小组件启动 APP,就会发现,好多组件用不了(没初始化)。

我这里图省事的做法就是把 Application 的所有需要初始化的东西都放 MainActivity 里面初始化了(但是 Content 还是用的 Application,而不是用 MainActivity)。

开搞

需求

一个小组件,居中显示一个文本,点击可进入 APP

1、准备一个布局文件 widget_test.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/lly_bg"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/bg_test"android:orientation="vertical"><TextViewandroid:id="@+id/tv_test"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:text="测试" /></LinearLayout>

附上背景文件 bg_test.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><!--    背景色--><solid android:color="#ffffff" /><!--    圆角--><corners android:radius="20dp" />
</shape>

2、res 文件夹下新建一个 xml 文件夹,新建 app_widget_test.xml 配置文件

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"android:minWidth="360dp"android:minHeight="120dp"android:updatePeriodMillis="1800000"android:previewImage="@drawable/ic_widget_big"android:initialLayout="@layout/widget_test"android:resizeMode="horizontal|vertical"android:widgetCategory="home_screen">
</appwidget-provider>

minWidth、minHeight    最小宽高

updatePeriodMillis    更新周期

previewImage    添加桌面小组件时候显示的预览图

initialLayout    布局

widgetCategory    home_screen 是代表的桌面小组件,其他参数自行百度了

3、合适的地方新建一个 TestAppWidget 类,继承 AppWidgetProvider


/*** 桌面小组件** @author Admin*/
public class TestAppWidget extends AppWidgetProvider {/*** 每次窗口小部件被更新都调用一次该方法(创建、时间到更新周期都会调起这里)*/@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {super.onUpdate(context, appWidgetManager, appWidgetIds);//更新数据updateWidgetView(context, UUID.randomUUID().toString());}/*** 接收窗口小部件点击时发送的广播*/@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);}/*** 每删除一次窗口小部件就调用一次*/@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {super.onDeleted(context, appWidgetIds);}/*** 当最后一个该窗口小部件删除时调用该方法*/@Overridepublic void onDisabled(Context context) {super.onDisabled(context);}/*** 当该窗口小部件第一次添加到桌面时调用该方法*/@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 onRestored(Context context, int[] oldWidgetIds, int[] newWidgetIds) {super.onRestored(context, oldWidgetIds, newWidgetIds);ALog.e("当小部件从备份恢复时调用该方法");}/*** 更新桌面小组件数据用,APP中也可以在任意地方传入任意数据进来主动更新小组件数据*/public static void updateWidgetView(Context context, String str) {//初始化RemoteViewsComponentName componentName = new ComponentName(context, TestAppWidget.class);RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_test);//点击事件,点击跳转到MainActivity页面Intent startActivityIntent = new Intent(context, MainActivity.class);PendingIntent processInfoIntent;if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {//31,Android11以上系统processInfoIntent = PendingIntent.getActivity(context, 0, startActivityIntent, PendingIntent.FLAG_IMMUTABLE);} else {processInfoIntent = PendingIntent.getActivity(context, 0, startActivityIntent, PendingIntent.FLAG_ONE_SHOT);}remoteViews.setOnClickPendingIntent(R.id.lly_bg, processInfoIntent);//更新文本数据remoteViews.setTextViewText(R.id.tv_test, str);//开始更新视图AppWidgetManager awm = AppWidgetManager.getInstance(context);awm.updateAppWidget(componentName, remoteViews);}}

4、AndroidManifest.xml 中配置小组件,与 Activity 页面同级

        <receiverandroid:name=".TestAppWidget"android:exported="false"><intent-filter><action android:name="android.appwidget.action.APPWIDGET_UPDATE" /></intent-filter><meta-dataandroid:name="android.appwidget.provider"android:resource="@xml/app_widget_test" /></receiver>

参考文章

https://blog.csdn.net/weixin_43499030/article/details/90264915

https://blog.csdn.net/weixin_43499030/article/details/90264915

Android 桌面小组件 AppWidgetProvider相关推荐

  1. android 桌面小组件小记

    记录自己在开发小组件时的几个问题: 1.数据已经更新,但是页面加载的还是旧数据: 2.小组件的点击事件: 3.4个小组件同时刷新: 4.小组件数据列表的item点击事件 1.小组件的页面刷新依赖一下代 ...

  2. Android 桌面小组件

    创建桌面小组件 创建AppWidgetProvider类 创建一个AppWidgetProvider类,桌面小组件在更新.启用.停用和删除应用微件时收到广播.而AppWidgetProvider继承B ...

  3. Android桌面小组件时钟实现

    进来需要做一个桌面小组件的项目,其中当然包括了时钟.度娘一下发现所有的文章都是说自己放表盘.分钟.时针三张图片,用service做个定时器控制指针旋转时间相对应的角度来更新小组件,然后需要前台serv ...

  4. android桌面小组件,桌面小组件

    桌面小组件安卓版上线啦,非常实用的手机主题桌面美化神器,可以帮助用户进行桌面的美好,还可以在这里添加各种小组件在桌面上,根据自己喜欢的方式进行排列,非常的有意思,操作非常简单,需要就赶快点击下载吧! ...

  5. android桌面小组件开发_快使用Scriptable自己开发一个iPhone小组件吧

    最近苹果的 iOS 系统升级到了 iOS 14,这次的更新我比较关注的就是升级的小组件功能,这次更新我们可以将小组件放置在主屏幕中的任何位置,可以让我们更加便捷的查看一些信息,从而省去了还需要打开AP ...

  6. Android桌面小组件---Widget组件开发(什么是Widget)

    1.什么是Weidget Widget就是可以放在桌面上的组件,包括像天气.便签.日历.流量控制等等,都是Widget,点击进去,可以提供相应的功能: 2.Widget的特点 (1)可以自定义 (2) ...

  7. 【Android开发日常】一文弄懂桌面图标快捷菜单 桌面小组件

    本文将介绍如何创建和管理应用快捷方式.如何创建和管理应用桌面小组件. 目录 一.桌面菜单 1.1 概览 1.2.为什么需要桌面图标快捷菜单 1.3.如何实现桌面图标快捷菜单 1.3.1 创建静态快捷方 ...

  8. android 组件消失了,Android 12 2.2 开发者预览版发布:修复桌面小组件消失等问题...

    IT 之家 4 月 8 日消息 据外媒 XDA 论坛消息,Android 12 2.2 开发者预览版今日发布,同时包含安卓 2021 年 4 月安全更新.本次预览版主要修复了一些错误,没有带来重要功能 ...

  9. 从 iOS 14 到 Android 12,桌面小组件是怎么「文艺复兴」的

    本文转载自 极客公园 时尚界一直以来有一个著名的理论:在某一时代流行的时尚元素,在经过一段时间的沉寂之后,会被人们再次拿出来利用. 这便是「弗莱定律」,它解释了为什么在长期的历史中,为什么很多曾经时尚 ...

  10. 实践--桌面小组件之天气小组件

    首先感谢这篇博客的博主,通过他的博客才学会的如何使用小组件. 效果图如下 关于小组件的原理已经在 UI控件–桌面小组件(1)介绍过了,又需要的自行去浏览. 1.在res/xml下创建配置文件appwi ...

最新文章

  1. 史上最全 Java 多线程面试题及答案
  2. matlab中cell用法
  3. 取消MySQL timestamp列默认ON UPDATE CURRENT_TIMESTAMP
  4. Salesforce视图与控制器之间的交互
  5. distcc源码研究三
  6. java里面的 |运算符_Java 中 | ^ 运算符的简单使用
  7. matlab检测串口数据帧头,用matlab从串口读入数据产生图像进行分析遇到的问题,求大虾帮助!...
  8. nc65 单据非向导开发 源代码_【免费毕设】ASP.NETIT产品网上物流管理信息系统的设计与实现(源代码+论文)...
  9. 阿里java注释规范_阿里巴巴Java开发手册-注释规约
  10. 多元函数泰勒展开与黑塞矩阵
  11. 装备购买(BZOJ4004)高斯消元+ 贪心
  12. linux yum 安装播放器,centos5下用yum安装MPlayer播放器
  13. 谷歌文档为什么没法登录_如何将Google文档文档转换为Microsoft Office格式
  14. 证券交易金融知识学习(1)
  15. mysql 数据库1
  16. matlab留学生作业代做,代做DFT留学生作业、代写Matlab实验作业、Matlab程序语言作业调试、FFT课程作业代做代做数据库SQL|调试Matlab程序...
  17. 黑群辉DSM 6.2.3 系统安装
  18. 【第二十四题】逻辑闭环(北理工/北京理工大学/程序设计方法与实践/小学期 )
  19. 基姆拉尔森时间计算公式
  20. 王者荣耀背后的实时大数据平台用了什么黑科技?

热门文章

  1. 华东理工大计算机专业,华东理工大学计算机专业怎么样(计算机专业大学排名50)...
  2. 现代软件工程 -- 第一周 -- 介绍自己
  3. 表白生成器PHP源码,带自动生成的php表白程序 v1.0
  4. 您必须拥有这台计算机上的终端服务器用户访问权限的解决方案
  5. 号称最好的国产操作系统在 Windows 10 面前能否一战?
  6. java嵌套条件运算符_java条件运算符的嵌套使用
  7. 全美计算机科学与技术排名,卡耐基梅隆大学计算机科学专业排名第1(2020年USNEWS美国排名)...
  8. hihocoder 1251 Today Is a Rainy Day 2015北京区域赛C
  9. 火端搜索V2.1原始程序
  10. 芯邦主控的U盘量产教程