1. 新建小组件UI布局
在res/layout下创建小组件xml文件,例如:
注意事项:Widget并不支持所有的控件跟布局(小组件的初衷也只是展示一些简单信息)
1)支持布局:
FrameLayout
LinearLayout
RelativeLayout
GridLayout
2)支持控件:
AnalogClock
Button
Chronometer
ImageButton
ImageView
ProgressBar
TextView
ViewFlipper
ListView
GridView
StackView
AdapterViewFlipper
2. 定义小组件配置信息
在res/xml下创建小组件配置信息,例如:
常见参数解释:
- configer:在用户添加应用微件时启动以便用户配置应用微件属性的Activity
- minWidth/minHeight:指定应用微件默认情况下占用的最小空间
- minResizeWidth/minResizeHeight:指定应用微件的绝对最小大小
- previewImage:用户在选择应用微件时看到的预览图
- resizeMode:指定可以按什么规则来调整微件的大小,属性的值包括“horizontal”、“vertical”和“none”
- targetCellHeight/targetCellWidth:添加到主机时小部件的默认高度/宽度,跟minWidth与minHeight类似
- updatePeriodMillis:通过调用onUpdate()回调方法来从AppWidgetProvider请求更新的频率应该是多大
- initialLayout:用于定义应用微件布局的布局资源
- widgetCategory:用来确定此小部件是否可以显示在主屏幕、键盘或两者上
3. 使用AppwidgetProvider类
为自己的小组件创建一个继承自AppwidgetProvider的类,AppWidgetProvider类本质就是一个广播接收者,在其内部可以监听到小组件的一些生命周期,可以用来更新小组件、处理一些逻辑等,例如:
public class MyAppWidget extends AppWidgetProvider {
/**
* 接收窗口小部件点击时发送的广播
*/
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
}
/**
* 每次窗口小部件被更新都调用一次该方法
* 与上面updatePeriodMillis是对应的
*/
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
/**
* 每删除一次窗口小部件就调用一次
*/
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
}
/**
* 当该窗口小部件第一次添加到桌面时调用该方法
*/
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
}
/**
* 当最后一个该窗口小部件删除时调用该方法
*/
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
}
/**
* 当小部件大小改变时
*/
@Override
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);
}
/**
* 当小部件从备份恢复时调用该方法
*/
@Override
public void onRestored(Context context, int[] oldWidgetIds, int[] newWidgetIds) {
super.onRestored(context, oldWidgetIds, newWidgetIds);
}
}
4. 在AndroidManifest清单文件中声明配置
<!-- 倒数日小组件 -->
<receiver
android:name=".widget.CountdownDaysSmallWidget"
android:exported="true">
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_countdown_days_small_provider" />
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
</receiver>
参考官方文档:
https://developer.android.google.cn/guide/topics/appwidgets?hl=zh-cn