widget介绍
App widget 是可以被嵌入到其它应用程序中的窗口小部件。
流程
- 创建类继承
AppWidgetProvider
- 在
layout
中创建widget
布局文件 - 在
res
目录下创建xml
文件夹,创建并初始化根节点为AppWidgetProvider
的配置文件 - 在清单文件中声明第一步继承
AppWidgetProvider
的类文件,同时配置第三步创建的配置文件 - 在自定义的
AppWidgetProvider
中实现业务逻辑
创建AppWidgetProvider
子类
AppWidgetProvider
继承 BroadcastReceiver
能够接收相关的广播:widget
的更新,删除,开启,禁用等.同时也可以接受自定义的广播.
onUpdate()
当
widget
更新时被调用同样当用户首次添加
widget
时,该方法也会被调用.但是如果定义了widget
的configure
属性那么第一次添加时该方法不会被调用,只有当widget
更新时才会被调用.
onDeleted(Context, int[])
当
widget
被删除时该方法被调用
onEnabled(Context)
当第一个
widget
的实例被添加时会触发该方法.一个应用可以有多个不同尺寸的
widget
,一个widget
可以被添加多次.这里主要针对第二点,该方法对于同一个widget
只有在第一次添加时才被调用.
onDisabled(Context)
该方法和
onEnabled ()
方法对应,当最后一个widget
被删除时该方法被调用.
onReceive(Context, Intent)
当收到在配置文件中注册的广播时,该方法会被回调
总结
AppWidgetProvider
继承自BroadcastReceiver
. 实质上AppWidgetProvider
中的onUpdate``onDeleted``onEnabled``onDisabled``onReceive
等方法都是在父类方法的onReceive
方法中回调的:
设计布局
布局的设计就直接根据设计稿完成即可
xml
文件夹下的配置文件
AppWidgetProviderInfo
描述app widget 元数据,比如布局,更新频率,预览图等信息.
<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|keyguard"
android:initialKeyguardLayout="@layout/example_keyguard">
</appwidget-provider>
minWidth 和minHeight
它们指定了App Widget布局需要的最小区域。
缺省的App Widgets所在窗口的桌面位置基于有确定高度和宽度的单元网格中。如果App Widget的最小长度或宽度和这些网格单元的尺寸不匹配,那么这个App Widget将上舍入到最接近的单元尺寸。单元格的尺寸是由所使用的launcher决定的。粗略计算可以参考下面这个表格:
单元格格数(行/列) | 对应的大小(dp) |
---|---|
1 | 40dp |
2 | 110dp |
3 | 180dp |
4 | 250dp |
n | 70*n-30 |
updatePeriodMillis
它定义了 widget 的更新频率。实际的更新时机不一定是精确的按照这个时间发生的。
previewImage
指定预览图,该预览图在用户选择 widget 时出现,如果没有提供,则会显示应用的图标。该字段对应在 AndroidManifest.xml 中 receiver 的 android:previewImage 字段。由 Android 3.0 引入。
initialLayout
指向 widget 的布局资源文件
configure
可选属性,定义了 widget 的配置 Activity。如果定义了该项,那么当 widget 创建时,会自动启动该 Activity。
resizeMode
指定了 widget 的调整尺寸的规则。可取的值有: “horizontal”, “vertical”, “none”。”horizontal”意味着widget可以水平拉伸,“vertical”意味着widget可以竖值拉伸,“none”意味着widget不能拉伸;默认值是”none”。Android 3.1 引入
widgetCategory
指定了 widget 能显示的地方:能否显示在 home Screen 或 lock screen 或 两者都可以。它的取值包括:”home_screen” 和 “keyguard”。Android 4.2 引入。
initialKeyguardLayout
指向 widget 位于 lockscreen 中的布局资源文件。Android 4.2 引入。
清单文件中配置
<receiver android:name=".ExampleAppWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="com.skywang.widget.UPDATE_ALL"/>
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/example_appwidget_info" />
</receiver>
- ExampleAppWidgetProvider是继承于的AppWidgetProvider类,用来响应widget的添加、删除、更新等操作
- android.appwidget.action.APPWIDGET_UPDATE,必须要显示声明的action!因为所有的widget的广播都是通过它来发送的;要接收widget的添加、删除等广播,就必须包含它
- action android:name=”com.skywang.widget.UPDATE_ALL,自定义的广播
- 指定了 AppWidgetProviderInfo 对应的资源文件
android:name – 指定metadata名,通过android.appwidget.provider来辨别data。
android:resource – 指定 AppWidgetProviderInfo 对应的资源路径。即,xml/example_appwidget_info.xml
App Widget支持的布局和控件
App Widget支持的布局
FrameLayout
LinearLayout
RelativeLayout
GridLayout
App Widget支持的控件
AnalogClock
Button
Chronometer
ImageButton
ImageView
ProgressBar
TextView
ViewFlipper
ListView
GridView
StackView
AdapterViewFlipper