前言

微件是定制主屏幕的一个重要方面。它允许您从用户的主屏幕直接看到最重要的应用程序数据和功能。用户可以在主屏幕面板之间移动微件、调整其大小,并根据自己的喜好自定义微件中的信息量。微件类型主要分为:信息微件(显示对用户来说很重要的一些关键信息元素,并跟踪该信息随时间变化的情况),集合微件(专门显示同一类型的众多元素),控制微件(专门显示同一类型的众多元素),混合微件(将不同类型的元素组合在一起)。

本文将用一个信息微件——在桌面显示时间为实例简单初步学习appwidget,实例如下:

步骤一:

新建一个NewAppWidget,具体方法如下:


添加好后可看到:

每个微件必须定义 minWidth 和 minHeight,表示默认情况下应占用的最小空间量。微件占用的宽度和高度一般会超过指定的最小值。Android 主屏幕为用户提供了一个可用空间网格,供他们放置微件和图标。此网格可能因设备而异。添加微件后,它将在水平和垂直方向进行拉伸,占用满足其 minWidth 和 minHeight 约束条件所需的最小单元格数。手机一般不能超过4x4网格。

接着可以看到创建成功的NewAppWidget:

package com.example.myapplication;import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.widget.RemoteViews;/*** Implementation of App Widget functionality.*/
public class NewAppWidget extends AppWidgetProvider {static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,int appWidgetId) {CharSequence widgetText = context.getString(R.string.appwidget_text);// Construct the RemoteViews objectRemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);views.setTextViewText(R.id.appwidget_text, widgetText);// Instruct the widget manager to update the widgetappWidgetManager.updateAppWidget(appWidgetId, views);}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {// There may be multiple widgets active, so update all of themfor (int appWidgetId : appWidgetIds) {updateAppWidget(context, appWidgetManager, appWidgetId);}}@Overridepublic void onEnabled(Context context) {// Enter relevant functionality for when the first widget is created}@Overridepublic void onDisabled(Context context) {// Enter relevant functionality for when the last widget is disabled}
}

可以看到当发生这些广播事件时,AppWidgetProvider 会接收以下方法调用:
onUpdate():当用户添加应用微件时会调用此方法,所以它应执行基本设置。
onEnabled(context):如果用户添加应用微件的两个实例,只有首次添加时会调用此方法。使用此方法打开一个新的数据库或执行只需要对所有应用微件实例执行一次的其他设置.
onDisabled(Context):从应用微件托管应用中删除了应用微件的最后一个实例时,会调用此方法。使用此方法来清理在 onEnabled(Context) 中完成的所有工作。
还有未显示的onReceive(Context, Intent):针对每个广播调用此方法,并且是在上述各个回调方法之前调用。

步骤二:

创建应用微件布局:

其实当NewAppWidget创建好后,就可以发现在res/layout中已经创建好new_app_widget.xml布局文件,稍微修改后代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"style="@style/Widget.MyApplication.AppWidget.Container"android:layout_width="match_parent"android:layout_height="match_parent"android:theme="@style/Theme.MyApplication.AppWidgetContainer"><TextViewandroid:id="@+id/appwidget_text"style="@style/Widget.MyApplication.AppWidget.InnerView"android:layout_width="168dp"android:layout_height="152dp"android:layout_centerInParent="true"android:layout_marginStart="8dp"android:layout_marginTop="8dp"android:layout_marginEnd="8dp"android:layout_marginBottom="8dp"android:background="#FFBB86FC"android:contentDescription="@string/appwidget_text"android:gravity="center"android:text="@string/appwidget_text"android:textColor="@color/white"android:textSize="24sp"android:textStyle="bold|italic" />
</RelativeLayout>

此时已经创建好的res/xml/new_app_widget_info.xml也需要稍微修改,如下:

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"android:description="@string/app_widget_description"android:initialKeyguardLayout="@layout/new_app_widget"android:initialLayout="@layout/new_app_widget"android:minWidth="150dp"android:minHeight="100dp"android:previewImage="@drawable/example_appwidget_preview"android:previewLayout="@layout/new_app_widget"android:resizeMode="horizontal|vertical"android:targetCellWidth="3"android:targetCellHeight="3"android:updatePeriodMillis="86400000"android:widgetCategory="home_screen" />

步骤三:

到此,基本的微件已经大致完成,现在就需要更改NewAppWidget.Java中的部分代码,将onUpdate()中的代码改为:

 public   void  onUpdate(Context context, AppWidgetManager appWidgetManager,int [] appWidgetIds){final   int  N  =  appWidgetIds.length;for  ( int  i  =   0 ; i  <  N; i ++ ){int  appWidgetId  =  appWidgetIds[i];RemoteViews views  =   new  RemoteViews(context.getPackageName(),R.layout.new_app_widget);java.text.DateFormat df  =   new  java.text.SimpleDateFormat( " hh:mm:ss " );views.setTextViewText(R.id.appwidget_text,  df.format( new Date()));appWidgetManager.updateAppWidget(appWidgetId, views);}}

实现微件显示系统时间

步骤四:

检查配置:

可以看到AndroidMainifest.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.MyApplication"tools:targetApi="31"><receiverandroid:name=".NewAppWidget"android:exported="false"><intent-filter><action android:name="android.appwidget.action.APPWIDGET_UPDATE" /></intent-filter><meta-dataandroid:name="android.appwidget.provider"android:resource="@xml/new_app_widget_info" /></receiver><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><meta-dataandroid:name="android.app.lib_name"android:value="" /></activity></application></manifest>

步骤五:

运行:

在Android模拟器上长按屏幕,点击Widgets,找到My Application,将其拖拽到主屏幕即可显示系统时间,如实例图所示。

总结:

该文本只是通过简单的实例对appwidgets进行粗略的学习,该实例无法实现每秒刷新。若需进行widgets实时更新,需创建一个服务类Timeservice,并修改NewAppWidget中的方法调用。

参考资料:https://developer.android.google.cn/guide/topics/appwidgets/overview

Android Studio 实现桌面小组件(APPWidget)相关推荐

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

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

  2. Android 桌面小组件

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

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

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

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

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

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

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

  6. android 桌面小组件小记

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

  7. Android桌面小部件AppWidget:音乐播放器桌面控制部件Widget(3)

     Android桌面小部件AppWidget:音乐播放器桌面控制部件Widget(3) Android桌面小部件AppWidget比较常用的场景就是音乐播放器,音乐播放器虽然通常在后台播放,但需要 ...

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

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

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

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

最新文章

  1. Android开发--圆角按钮和绘制直线的实现
  2. AB1601的OTA区224K存储空间的使用注意事项
  3. 方法中的参数的五种形式
  4. 一个Linux下C线程池的实现(转)
  5. [转] UML中关联、依赖、聚集等关系的异同
  6. MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)
  7. 第 10 章 数组和指针
  8. utf—8在苹果手机上乱码_Xcode下的中文乱码问题
  9. python txt 操作_python TXT文件操作
  10. python下:用 matplotlib.pyplot 显示 Opencv 读取的图像
  11. phoneGap、JQueryMobile 简介及中文API地址
  12. 第四章 类中数据的共享和保护
  13. python下载付费音乐包_python无损音乐下载器下载
  14. 5万成员丨CSDN 大数据领域网红社区!
  15. AD 画PCB 布线时,连线就变绿
  16. xp计算机组策略怎么打开,打开组策略的命令,教你组策略怎么打开!
  17. 区块链未来的发展前景是什么?
  18. Leetcode题库1823. 找出游戏的获胜者(约瑟夫环 C实现)
  19. SGMII光模块知识百科
  20. 海底捞市值蒸发2323亿关店300家,火锅“炼金术”还灵验吗?

热门文章

  1. CodeMirror 格式化内容和内容选择CodeMirror 官方文档
  2. shell-------数组遍历、切片、替换等操作
  3. Vue2.0 内置指令directives 与全局配置过滤filters
  4. js 判断是域名还是ip并获取当前url中指定部分
  5. FHQ Treap【基于P3369的讲解】【随机数、各数组、函数运用】
  6. 2019年最佳黑客书籍 - 初级到高级
  7. d2的自定义训练和增强
  8. bat: %~d0 %cd% %~dp0
  9. OpenCV基础教程——视频的读取与写入(超详细+附代码)
  10. H5调用移动端手机摄像头