这里根据官方参考文档简单介绍为Android应用添加桌面小工具的方法,详情请查阅官方参考文档。(“Widget”中文的意思是“小工具”、“小部件”、“窗口小部件”的意思。)
桌面小工具可以让用户直接在桌面上操作应用的部件功能,例如音乐播放器的小工具可以让用户方便地播放或者暂停音乐,又例如最常见的天气时间桌面小工具。越来越多的应用添加了桌面小工具的功能。
为应用添加桌面小工具的大概流程1\. 新建一个布局文件,即桌面小工具的视图;
2\. 新建一个XML文件,该文件包含有桌面小工具相关信息,例如小工具的布局、更新频率等 ;
3\. 定义一个类,这个类要继承AppWidgetProvider类,并且实现相关方法。
为应用添加桌面小工具的详细流程
第一步:新建一个布局文件,即在res/layout/下新建一个layout布局文件,例如desktop_widget.xml,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13< ?xml version="1.0" encoding="utf-8"?>
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ON"
android:textSize="20sp">
第二步:在res/xml/下新建一个XML文件,例如新建一个名为desktop_widget_info.xml文件,这个XML文件包含了桌面小工具的一些重要元数据,内容如下:
1
2
3
4
5
6
7
8
9
10< ?xml version="1.0" encoding="utf-8"?>
android:minWidth="40dp"
android:minHeight="40dp"
android:updatePeriodMillis="48000000"
android:previewImage="@drawable/pre_widget"
android:initialLayout="@layout/desktop_widget"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen|keyguard">
参数说明:
minWidth、minHeight:分别指定小工具的默认宽度和高度,关于小工具大小的规格说明:
单元
尺寸
1
40dp
2
110dp
3
180dp
4
250dp
n
70*n - 30
具体请参考:http://developer.android.com/guide/practices/ui_guidelines/widget_design.html#anatomy_determining_size
updatePeriodMillis:小工具更新的频率,单位是毫秒。
previewImage:小工具预览图。
initialLayout:小工具的布局文件。
resizeMode:可以设置小工具的可调整方向,如水平或者垂直。
widgetCategory:小工具可显示的位置,如桌面或者锁屏界面。
第三步:新建一个继承了AppWidgetProvider的类,并且实现相关方法。例如我新建了一个名为DesktopWidget.class的类。其实桌面小工具是基于Broadcast的形式实现的,每一个桌面小工具都对应于一个BroadcastReceiver类。而AppWidgetProvider类是BroadcastReceiver的子类,桌面小工具只需要继承AppWidgetProvider类并实现相关方法即可。
在AndroidManifest.xml中添加如下内容:
1
2
3
4
5
6
7
8
android:name="android.appwidget.provider"
android:resource="@xml/desktop_widget_info" />
请注意meta-data标签下的android:resource指定的是第二步中新建的XML文件。
下面开始实现这个DesktopWidget.class类,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71/*
* 桌面小工具
* @author Garth http://garth.im
*/
public class DesktopWidget extends AppWidgetProvider{
private static RemoteViews remoteViews;
/**
* 调用时机: 1.到达指定的更新时间 2.用户向桌面添加appwidget时候
* 系统会发出一个android.appwidget.action.APPWIDGET_UPDATE广播
* 根据AndroidManifest.xml注册信息,启动widgetProvider,然后AppWidgetProvider接收
* 到广播后,调用onUpdate方法初始化
*/
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds){
remoteViews = new RemoteViews(context.getPackageName(), R.layout.desktop_widget);
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
remoteViews.setOnClickPendingIntent(R.id.tvWidget, pendingIntent);
if(MainService.state){
remoteViews.setTextViewText(R.id.tvWidget, "ON");
}else{
remoteViews.setTextViewText(R.id.tvWidget, "OFF");
}
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
}
/**
* 当App Widget被删除时被调用。
*/
@Override
public void onDeleted(Context context, int[] appWidgetIds){
super.onDeleted(context, appWidgetIds);
}
/**
* 同一个App Widget实例第一次创建时被调用。
* 比如,如果用户添加两个App Widget实例,只在第一次被调用。
* 如果你需要打开一个新的数据库或者执行其他对于所有的App Widget实例只需要发生一次的设置,
* 那么就在这个方法里定义吧
*/
@Override
public void onEnabled(Context context){
super.onEnabled(context);
}
/**
* 当你的App Widget的最后一个实例被删除时被调用。
* 如果有数据库连接等操作,可以在这里关闭掉吧。
*/
@Override
public void onDisabled(Context context){
super.onDisabled(context);
}
/**
* 接收到每个广播时都会被调用,而且在上面的回调函数之前。
* 通常不需要实现这个方法,因为默认的AppWidgetProvider已经过滤所有App Widget广播并恰当的调用上述方法。
*/
@Override
public void onReceive(Context context, Intent intent){
super.onReceive(context, intent);
}
}