Android的AppWidget的概念不好理解啊,我也不知道理解得對不對,先記在這里,以免以后又忘記了。
(1) 建立一個Android工程,用eclispse吧,下一步,下一步的就不多說了。
(2) 在res/xml目錄下面建立一個xml文件。命名隨便吧。寫下如下內容
1
<?xml version="1.0" encoding="utf-8"?>
2
<appwidget-provider
3
xmlns:android="http://schemas.android.com/apk/res/android"
4
android:initialLayout="@layout/widget_layout_small"
5
android:minWidth="72dip" android:minHeight="72dip" android:updatePeriodMillis="3600000">
6
</appwidget-provider>
這里是定義一個appwidget-provider,Android系統從這里認為該程序是一個widget程序。android:initialLayout指定布局文件,也就是在res/layout目錄下的那些個xml文件;android:updatePeriodMillis知道更新周期,單位為毫秒;還有一個android:configure,這個是可選的,如果你的widget事先要啟動一個Activity,就需要在這里指定一個Activity,顯然我們這里不需要。他就是一個AppWidgetProviderInfo類的描述信息。
(3) 寫布局文件,這個就不多說了。
(4) appwidget-provider,定義一個類,從AppWidgetProvider類繼承,他實際是一個BroadcastReceiver,系統使用它和Widget界面進行交互。
1
package cn.vaga.today;
2
3
import java.util.Calendar;
4
5
import android.app.PendingIntent;
6
import android.appwidget.AppWidgetManager;
7
import android.appwidget.AppWidgetProvider;
8
import android.content.ComponentName;
9
import android.content.Context;
10
import android.content.Intent;
11
import android.graphics.Canvas;
12
import android.text.format.Time;
13
import android.widget.RemoteViews;
14
15
public class TodayDateSmall extends AppWidgetProvider
16

{
17
// 當這個AppWidget提供者 被要求提供RemoteViews一系列的AppWidgets,這個方法作為ACTION_APPWIDGET_UPDATE
18
// 廣播回復時被調用
19
// 每次更新AppWidget時候調用
20
@Override
21
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
22
// 得到更新后的RemoteViews
23
RemoteViews updateView = buildUpdate(context);
24
//更新Widget的RemoteViews
25
appWidgetManager.updateAppWidget(appWidgetIds, updateView);
26
super.onUpdate(context, appWidgetManager, appWidgetIds);
27
}
28
29
private String[] months =
{"一月", "二月", "三月", "四月",
30
"五月", "六月", "七月", "八月",
31
"九月", "十月", "十一月", "十二月"};
32
33
34
private RemoteViews buildUpdate(Context context)
{
35
RemoteViews updateView = null;
36
// 這個Time更快
37
// Time time = new Time();
38
// 現在
39
//time.setToNow();
40
Calendar cal = Calendar.getInstance();
41
String month = months[cal.get(Calendar.MONTH)];
42
// 得到RemoteViews
43
updateView = new RemoteViews(context.getPackageName(), R.layout.widget_layout_small);
44
// 設置View的內容
45
// 日期
46
updateView.setTextViewText(R.id.Date, String.valueOf(cal.get(Calendar.DATE)));
47
// 月
48
updateView.setTextViewText(R.id.Month, month);
49
Lunar lunar = new Lunar(cal);
50
updateView.setTextViewText(R.id.Lunar,lunar.toString());
51
// OK,這個一個運行用的Intent啦
52
// 加下面這段應該只是為了讓Widget相應click事件吧
53
Intent launchIntent = new Intent();
54
// 設置處理該Intent的組件,這里是android自帶的日期啟動組件
55
launchIntent.setComponent(new ComponentName("com.android.calendar", "com.android.calendar.LaunchActivity"));
56
// 設置該Itent為主進入點
57
launchIntent.setAction(Intent.ACTION_MAIN);
58
launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
59
launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
60
// 啟動指定的Intent的Activity
61
PendingIntent intent = PendingIntent.getActivity(context, 0, launchIntent, 0);
62
// 監聽點擊事件
63
updateView.setOnClickPendingIntent(R.id.SmallBase, intent);
64
return updateView;
65
}
66
}
67
68
他有四個方法:onDeleted、onEnabled、onDisabled、onUpdate,我們這里只實現了最主要的onUpdate方法,他在周期更新的時候調用。每次調用就用appWidgetManager來更新Widget(生成一個RemoteView)。appWidgetManager是系統生成的用于管理Widget的對象,我們不需要進行管理,它會向AppWidgetProvider發通知,他會更新Widget的UI。
(5) AndroidManifest.xml
1
<?xml version="1.0" encoding="utf-8"?>
2
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3
package="cn.vaga.today"
4
android:versionCode="1"
5
android:versionName="1.0">
6
<application android:icon="@drawable/icon" android:label="@string/app_name_small">
7
<!-- 訂閱指定的BroadcastReceiver -->
8
<receiver android:label="@string/app_name_small" android:name=".TodayDateSmall">
9
<intent-filter>
10
<!-- 就只處理更新的廣播 -->
11
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
12
</intent-filter>
13
<meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_small"></meta-data>
14
</receiver>
15
</application>
16
<uses-sdk android:minSdkVersion="7" />
17
18
</manifest>
在這里注冊AppWidgetRecever指定其處理的Intent的Action為android.appwidget.action.APPWIDGET_UPDATE。當然還要個AppWidgetRecever指定它的描述文件
<meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_small"></meta-data>,這是很必要的,否則Android也不會知道這個Widget到底是如何定義的了。