一:简介

App Widgets(微型应用视图)它能够嵌入到其他应用程序(如 系统桌面/其他应用的Activity)并接受定期更新,主要用于展现程序的快捷入口。

1.1 :AppWidgetProvider

AppWidgetProvider接口基于BroadcastReceiver,通过定义这个接口,当App Widget update据发送改变,启动(enabled) ,disabled(禁用), deleted(删除)动作时,AppWidgetProvider 将会收到广播。

1.2: View Layout

定义App Widget 的初始化XML布局文件,另外,可以在App Widget 启动前,添加一个Activity用于配置Widget的一些参数

二:使用

2.1 : 在AndroidMainfest.xml清单文件声明我们定义的 AppWidgetProvider类


<receiver android:name="ExampleAppWidgetProvider" ><intent-filter><--!指定AppWidgetProvider接受系统的APPWIDGET_UPDATE广播--><action android:name="android.appwidget.action.APPWIDGET_UPDATE" /></intent-filter><--!指定Meta_data名称,使用android.appwidgetb必须确定AppWidgetProviderInfo描述符的数据--><--!指定AppWidgetProviderInfo资源XML文件--><meta-data android:name="android.appwidget.provider"android:resource="@xml/example_appwidget_info" />
</receiver>

2.2 :创建AppWidgetProviderInfo  XML文件

该XML文件定义 App Widget 的基本属性,在 res/xml/ 目录下创建 appwidget-provider 标签的XML文件


<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"android:minWidth="40dp"android:minHeight="40dp"android:updatePeriodMillis="86400000"android:previewImage="@drawable/preview"android:initialLayout="@layout/example_appwidget"android:configure="com.example.android.ExampleAppWidgetConfigure"android:resizeMode="horizontal|vertical"android:widgetCategory="home_screen">
</appwidget-provider>

1:如果定义的minWidth 和 minHeight不匹配当前屏幕,会自动缩放到合适大小
2:如果定义的AppWidght想跨设备、最小宽高不应超过4*4单元格.
3:如果设备到了更新时间(updatePeriodMillis)时处于睡眠状态,设备将会被唤醒更新,体验不好,建议要么设置一个按钮让用户手动刷新,要么设置updatePeriodMillis为0,使用AlarmManager设置警报Intent让AppwidgetProvider类接受,将报警类型设置为ELAPSED_REALTIM或RTC,只有设备唤醒时才会发出警报
4:minResizeHeight属性指定小部件可以调整大小的最小高度.如果该字段大于minHeight,或者resizeMode的取值不包括vertical时,则该字段不起作用;
5:minResizeWidth属性指定小部件可以调整大小的最小宽度.如果该字段大于minWidth,或者resizeMode的取值不包括horizontal时,则此字段无效
6:AppWidget只有低于Android 5.0才能锁屏显示,高于5.0只能主屏显示

2.3:定义App Widget XML布局文件

由于widget的布局需要 RemoteViews 支持,因此不能随便定义或自定义View

三:定义AppWidgetProvider类

3.1 :onUpdate()

当widget更新时被执行.(包含首次添加),如果在 AppWidgetProviderInfo 调用android:config,那么当用户首次添加widget时,onUpdate()不会被调用,之后更新widget时,onUpdate才会被调用.

3.2 :  onAppWidgetOptionsChanged()

Android 4.1引入的,当 widget 被初次添加 或者 当 widget 的大小被改变时,执行onAppWidgetOptionsChanged().你可以在该函数中,根据 widget 的大小来显示/隐藏某些内容.可以通过 getAppWidgetOptions() 来返回 Bundle 对象以读取 widget 的大小信息,Bundle中包括以下信息

3.3:  onDeleted()

当 widget 被删除时被触发.

3.4: onEnabled()

当第一次创建widget实例时触发.如果用户对同一个widget增加了两次(两个实例),那么onEnabled()只会在第一次添加widget时触发.

3.5 : onDisabled();

最后一个widget删除时被触发

3.6: onReceive(Context, Intent)

接收到任意广播时触发,并且会在上述的方法之前被调用.实际上,App Widge中的onUpdate()、onEnabled()、onDisabled()等方法都是在 onReceive()中调用的;是onReceive()对特定事情的响应函数

3.7 : onRestored(Context context, int[] oldWidgetIds, int[] newWidgetIds)

在从备份还原此AppWidget提供程序的实例时,响应ACTION_APPWIDGET_RESTORED广播调用.

如果您的提供商维护有关其窗口小部件实例的任何持久性数据,请覆盖此方法以将旧的AppWidgetIds重新映射到新值,并更新可能相关的任何其他应用程序状态.

这个回调函数将立即通过调用onUpdate(Context,AppWidgetManager,int [])来实现,因此您的提供者可以立即生成适用于新恢复的实例集的新RemoteView.


public class ExampleAppWidget 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}@Overridepublic void onReceive(Context context, Intent intent) {//用于接收指定意图,处理相关需求,可以重写onRecrive(),如我们收到一个toast的动作时,显示一条Toast}}

四: 给App Widget设置点击事件

在AppWidgetProvider中最重要的回调是onUpate(),除非使用 configuration Activity ,不然每个 App Widget 添加到主机Host时都会调用onUpdate().

那么如果你的App Widget不需要创建临时文件或数据库,或需要执行清理其他工作,那么其他的逻辑业务基本在onUpate()中实现即可

onUpdate


public class ExampleAppWidgetProvider extends AppWidgetProvider {public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {final int N = appWidgetIds.length;// Perform this loop procedure for each App Widget that belongs to this providerfor (int i=0; i<N; i++) {int appWidgetId = appWidgetIds[i];// Create an Intent to launch ExampleActivityIntent intent = new Intent(context, ExampleActivity.class);intent.setAction("TOAST_ACTION");PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);// Get the layout for the App Widget and attach an on-click listener// to the buttonRemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);views.setOnClickPendingIntent(R.id.button, pendingIntent);// Tell the AppWidgetManager to perform an update on the current app widgetappWidgetManager.updateAppWidget(appWidgetId, views);}}
}

重写onReceive() ,用于接受意图,处理相关需求


@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);if (intent.getAction().equals("TOAST_ACTION")) {Toast.makeText(context, "Touched view ", Toast.LENGTH_SHORT).show();}}

五: 注意事项

1: appWidgetIds是一个ID数组,用于标识此提供程序创建的每个App Widget。 这样,如果用户创建了多个App Widget实例,那么它们都将同时更新。 但是,如果多个App Widget 设置了updatePeriodMillis,那么只会调用第一个App Widget 实例的

2: 由于AppWidgetProvider继承处于BroadcastReceiver,生命周期非常短,如果需要执行耗时操作会发生ANR异常,因此我们可以在onUpdate()方法中启动Service,然后在Service数据处理,个人建议在onRnable()启动服务,onDisable()关闭Service

Android桌面控件Widget解析相关推荐

  1. Android RemoteView的应用 一 桌面控件

    这回通过RemoteView来制作一个能够接受点击事件的桌面控件. 1. 在res/layout 新建widget文件,这是设计桌面控件的界面 <?xml version="1.0&q ...

  2. Android 开源控件与常用开发框架开发工具类

    Android的加载动画AVLoadingIndicatorView 项目地址: https://github.com/81813780/AVLoadingIndicatorView 首先,在 bui ...

  3. 系出名门Android(7) - 控件(View)之ZoomControls, Include, VideoView, WebView, RatingBar, Tab

    [索引页] [×××] 系出名门Android(7) - 控件(View)之ZoomControls, Include, VideoView, WebView, RatingBar, Tab, Spi ...

  4. 日历控件的android代码,Android日历控件PickTime代码实例

    Android日历控件PickTime代码实例 发布时间:2020-10-03 16:05:51 来源:脚本之家 阅读:86 作者:手撕高达的村长 最近做项目,需要设置用户的生日,所以做这样一个功能. ...

  5. xamarin.android 控件,Android 库控件 - Xamarin | Microsoft Docs

    Xamarin Android 库控件Xamarin.Android Gallery control 03/15/2018 本文内容 Gallery是一种布局小组件,用于显示水平滚动列表中的项,并将当 ...

  6. android 获取控件在屏幕中的坐标

    今天,简单讲讲android如何获取控件在屏幕中的坐标. 这个其实也很简单,但是昨天做一个功能时,需要功能控件的坐标做一些逻辑操作时,居然不知道怎么做.所以在网上查找了资料后,解决了这个问题.这里记录 ...

  7. Android图表控件MPAndroidChart——曲线图LineChart的使用(财富收益图)

    目录 前言 本文涉及文章 其他相关文章 1.数据准备 1.1 数据来源 2.曲线展示 2.1 MPAndroidChart获取 2.2 数据对象获取 2.3 数据展示 3.曲线完善 3.1 图表背景. ...

  8. Android AutoCompleteTextView控件实现类似百度搜索提示,限制输入数字长度

    Android AutoCompleteTextView 控件实现类似被搜索提示,效果如下 1.首先贴出布局代码 activity_main.xml: <?xml version="1 ...

  9. 一个Demo让你掌握Android所有控件

    一个Demo让你掌握Android所有控件 原文:一个Demo让你掌握Android所有控件 本文是转载收藏,侵删,出处:"安卓巴士"      下面给出实现各个组件的源代码: 1 ...

最新文章

  1. mysql连接卡死,很多线程sleep状态,导致CPU中mysqld占用率极高(问题原因还待考证)...
  2. 圈复杂度本质上就是——分支覆盖率达到100%需要的测试用例数
  3. 链表c的经典实现(一)
  4. MPMovieplayercontroller
  5. vbs当计算机重启,用vbs实现重新启动 Internet Explorer
  6. 如何让自己的内心强大起来
  7. 解决:Unable to access jarfile xxx-0.0.1-SNAPSHOT.jar
  8. 64位操作系统上ArcGIS Server Manager页面不正常显示
  9. Skype for Business Server 2015-12-WAP-发布-1-前端服务器-OWAS01
  10. 如何在C预处理器中可靠地检测Mac OS X,iOS,Linux,Windows? [重复]
  11. spingCloud 整合netty
  12. Android Multimedia框架总结(二十七)MediaCodec回顾
  13. 安卓基础干货(六):安卓Activity的学习
  14. 360二代抢票神器 v7.1.1.502 官方版
  15. 微型计算机原理及应用课程复习与考研指导,微机原理及应用课程复习.doc
  16. Python: PS 滤镜--碎片特效
  17. workman定时器使用
  18. RN:metro缓存以及如何清除缓存
  19. 嵌入式开发之NorFlash 和NandFlash
  20. Unity3d实现扭动挤压浏览效果

热门文章

  1. ASP.NET2.0里的web.config配置接口API(转)
  2. 零基础怎样学IT难吗?新手如何快速入门?
  3. 【条形码识别】基于计算机视觉实现二维条形码识别含Matlab源码
  4. 算法初步——冒泡排序
  5. 《奇点临近(The Singularity is Near:When Humans Transcend Biology)》
  6. Plu2006即将开赛,参赛选手名单公布
  7. C语言编程题:输入多个字符串,输出其中最短的字符串。
  8. pyspark实现iv特征筛选
  9. Python之路点燃编程圈:源于不爽C语言,单枪匹马搞副业,如今吞噬世界(附链接)...
  10. 中国人必须知道的76个常识。。。看了才发现,自己知道的实在太少了