APP小挂件指的是一个小型的应用View控件,他可以嵌入到其他应用程序中(比如说桌面),并接受定期的更新。你可以通过Widget Provider来自己发布一个。一个可以持有其他App小挂件的应用组件叫做AppWidget host。
下图表示一个音乐应用的挂件;
此文章将会描述怎么使用AppWidget provider去发布一个应用挂件。创建挂件牵涉到的类是:
android.appwidget.AppWidgetHost |
一、基本的描述
要创建一个App挂件,你需要做到下面的工作。
描述App挂件的元数据,比如说:挂件的布局,更新频率,和AppWidgetProvider类。你需在XML文件中定义
定义一个基于广播事件的允许动态改变挂件界面的方法,通过他,当你的应用挂件更新、变得可用、变得不可用、被删除的事件你都可以收到。
- View Layout
在XML文件中定义一个挂件的初始布局文件。
此外,你可以实现一个挂件配置 Activity,他是一个可选的Activity,当用户要添加你的挂件时,他会启动用于给用户设置和更改挂件的设置。
下面将介绍怎么去设置一个这样的组件
在Manifest中申明一个挂件
首先需要在Manifest中声明AppWidgetProvider类。比如说:
<receiver android:name="ExampleAppWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/example_appwidget_info" />
</receiver>
<receiver> 元素需要android:name属性,他指的是挂件使用的AppWidgetProvider
<intent-filter>必须要包含一个<action>元素,并且包含android:name属性。这个属性表示AppWidgetProvider接受ACTION_APPWIDGET_UPDATE广播。这是你唯一需要明确指定的广播接受,在必要的时候AppWidgetManager将会自动发送广播给所有挂件。
<meta-data>元素定义了AppWidgetProviderInfo资源,他需要有下面几个属性:
- Android:name----定义元数据的名字,此例中使用 “android.appwidget.provider ”来定义这个数据,作为AppWidgetProviderInfo的描述信息
- android:resource---定义AppWidgetProviderInfo资源的地址
添加AppWidgetProviderInfo元数据
AppWidgetProviderInfo 定义了一个挂件的基本品质,比如说:最小布局尺寸、他初始化的布局资源、更新挂件的频率、和configurationActivity在创建的时候加载。在XML文件中定义AppWidgetProviderInfo 对象只需要使用<appwidget-provider>元素,保存在res/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>
下面是<appwidget-provider>的属性概览:
- minWidth 和 minHeight 的值表示挂件需要的最小空间。默认情况下,挂件的位置是基于主屏幕中的具有宽高的方格子(可以看做将屏幕划分为很多个矩阵格子)。如果挂件的宽和高与方格子不匹配,挂件的尺寸将计算到与方格子相近的尺寸。
【注意:为了使你的挂件能方便的跨设备,你最好将你的最小尺寸设置为低于4 X 4】
- minResizeWidth 和 minResizeHeight 属性指定了挂件的绝对最小尺寸,这个值应该定义为,当你的挂件出现字迹不清与不可用时的最小尺寸。使用这些属性允许用户去重新设置挂件的尺寸,可能会小于你使用minWidth与minHigh的值。这个特性从 android 3.1开始
- updatePeriodMillis 属性定义了挂件多久被AppWidgetProvider调用onUpdate() 刷新一次,事实上不能保证准时刷新(会有一定的出入),我们建议刷新频率不要太高,以便保持电量。当然你也可以允许用户自己去设置刷新的频率,有的人可能会设置15分钟刷新,当然也有人可能设置为一天只刷新4次。
【如果设备正在休眠,但是到了刷新你挂件的时间,设备将会被激活,然后去执行更新操作。如果你一个多小时的刷新一次可能不会对电池造成什么影响,但是,如果你刷新频率比较高,或者可能不需要挂件在休眠的时候刷新,那么你可以基于alarm 刷新,他将不会激活设备。实现方式:使用你的AppWidgetProvider需要接受的Intent设置一个alarm(使用AlarmManager类),将alarm的类型设置为ELAPSED_REALTIME 或者RTC,这样只有在设备唤醒的情况下才通知你的挂件刷新,最后你需要将你的 updatePeriodMillis 设置为 0 】
- initialLayout 属性指向一个定义挂件布局的XML文件。
- configure 定义了一个Activity,在用户添加挂件的时候他将会启动,以便用户去设置挂件的配置。这是可选操作。(具体怎么创建后面将会介绍到)
- previewImage 属性,用作预览的图片。当用户还未添加挂件的时候通过此图片让用户大致知道你的挂件。此属性与在Manifest中的<receiver>中的android:previewImage是一样的。(具体怎么设置后面将会介绍)
- autoAdvanceViewId 属性定义了可以被挂件宿主自增加的子View的