主程式,運行視窗小組件的時候調用的類。需要在manifest.xml中註冊。package com.example.widgettext;import java.util.ArrayList;import java.util.Timer;import java.util.TimerTask;import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.Context;import android.widget.RemoteViews;public class AppClockWidgetProvider extends AppWidgetProvider {private static RemoteViews mRemoteViews;private static Timer mTimer;// mAppWidgetArray 儲存視窗組件執行個體的數組private static ArrayList mAppWidgetArray = new ArrayList();// 當最後一個視窗組件執行個體被移除時調用public void onDisabled(Context context) {// TODO Auto-generated method stubsuper.onDisabled(context);stopTimerTask();}// 當第一個視窗組件執行個體被建立時調用public void onEnabled(Context context) {// TODO Auto-generated method stubsuper.onEnabled(context);startTimerTask(context);}// 視窗組件執行個體建立時調用public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {// TODO Auto-generated method stubsuper.onUpdate(context, appWidgetManager, appWidgetIds);updateAppWidget(context, appWidgetManager, appWidgetIds);addInstance(appWidgetIds);}// 視窗組件執行個體刪除時調用public void onDeleted(Context context, int[] appWidgetIds) {// TODO Auto-generated method stubsuper.onDeleted(context, appWidgetIds);removeInstance(appWidgetIds);}// 更新單個視窗組件執行個體public static void updateAppWidget(Context context,AppWidgetManager appWidgeManger, int[] appWidgetIds) {mRemoteViews = new RemoteViews(context.getPackageName(),R.layout.activity_main);MyTimeAdapter timeAdapter = new MyTimeAdapter();String timeString = timeAdapter.formatTime();mRemoteViews.setTextViewText(R.id.myTextView, timeString);appWidgeManger.updateAppWidget(appWidgetIds, mRemoteViews);}// 更新所有視窗組件執行個體public static void RefreshAllWidget(Context context) {AppWidgetManager appWidgetManger = AppWidgetManager.getInstance(context);int instanceCount = mAppWidgetArray.size();for (int i = 0; i < instanceCount; i++) {int[] appWidgetIds = mAppWidgetArray.get(i);updateAppWidget(context, appWidgetManger, appWidgetIds);}}// 增加視窗組件執行個體public static void addInstance(int[] appWidgetIds) {if (mAppWidgetArray != null) {mAppWidgetArray.add(appWidgetIds);}}// 刪除視窗組件執行個體public static void removeInstance(int[] appWidgetIds) {if (mAppWidgetArray != null) {mAppWidgetArray.remove(appWidgetIds);}}// 開啟重新整理視窗組件的定時器public static void startTimerTask(final Context context) {if (mTimer == null) {mTimer = new Timer();TimerTask mTimerTask = new TimerTask() {@Overridepublic void run() {// TODO Auto-generated method stubAppClockWidgetProvider.RefreshAllWidget(context);}};mTimer.schedule(mTimerTask, 0, 1000);}}// 關閉重新整理視窗組件的定時器public static void stopTimerTask() {if (mTimer != null) {mTimer.cancel();mTimer = null;}}}
在主程式中用到的一個adapter
package com.example.widgettext;import java.util.Calendar;public class MyTimeAdapter {private Calendar mCalendar;public MyTimeAdapter() {long time = System.currentTimeMillis();mCalendar = Calendar.getInstance();mCalendar.setTimeInMillis(time);}public int getHour() {return mCalendar.get(Calendar.HOUR_OF_DAY);}public int getMinutes() {return mCalendar.get(Calendar.MINUTE);}public int getSecond() {return mCalendar.get(Calendar.SECOND);}public String formatTime() {String timeString = getHour() + : + getMinutes() + : + getSecond();return timeString;}}在res/xml檔案夾下配置的一個檔案,用來確定視窗小組件的大小。
在manifest.xml的內容(與運行activity的程式不同,這裡的action配置為receiver)