所謂桌面小控件,就是指能直接顯示在Android系統桌面的小程序。一般來説,開發者可以把一些用户使用十分頻繁的程序,比如時鐘、指南針、日曆等程序做成桌面控件,這樣用户可以直接在桌面上看到程序的運行界面。

桌面小控件是通過Broadcast的形式來進行控制的,因此每個桌面小控件都對應於一個BroadcastReceiver。為了簡化桌面小控件的開發,Android系統提供了一個APPWidgetProvider類,它就是BroadcastReceiver的子類,也就是説開發者開發桌面小控件只要繼承APPWidgetProvider類即可。

為了開發桌面小控件,開發者只要開發一個繼承APPWidgetProvider的子類,並重寫APPWidgetProvider不同狀態的生命週期方法即可。APPWidgetProvider裏提供如下四個不同的生命週期方法:

1、onUpdate:負責更新桌面控件的方法;實現桌面控件通常會考慮重寫該方法。

2、onDeleted:當一個或多個桌面小控件被刪除時回調該方法。

3、onEnabled:當接收到ACTION_APPWIDGET_ENABLED  Broadcast時回調該方法。

4、onDisabled:當接收到ACTION_APPWIDGET_DISABLED  Broadcast時回調該方法。

一般來説,開發桌面小控件只需要定義一個APPWidgetProvider的子類。並重寫它的onUpdate()方法即可,重寫該方法按如下步驟進行:

1、創建一個RemoteViews對象,創建該對象時可以指定加載指定的界面佈局文件。

2、如果需要改變上一步所加載的界面佈局文件的內容,可通過RemoteViews對象進行修改。

【注】一般來説,RemoteViews所加載的界面中主要包含ImageView和TextView兩種組件,RemoteViews提供了修改這兩種組件的內容和方法。

3、創建一個ComponentName對象。

4、調用APPWidgetProvider更新桌面小控件。

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.widget.RemoteViews;public class DeskTopApp extends AppWidgetProvider{
	  @Override
	  public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			            int[] appWidgetIds) {
		    System.out.println(java.util.Arrays.toString(appWidgetIds));
		    //加載指定界面佈局文件,創建RemoteViews對象
		    RemoteViews remoteViews = 
				          new RemoteViews(context.getPackageName(), R.layout.activity_desk_top_app);
    //		//為show  ImageView設置圖片
    //		remoteViews.setImageViewResource(R.id.show, R.drawable.logo);
		    //將APPWidgetProvider子類實例包裝成ComponentName對象
		    ComponentName componentName = new ComponentName(context, DeskTopApp.class);
		    //調用APPWidgetManager將RemoteViews添加到ComponentName中
		    appWidgetManager.updateAppWidget(componentName, remoteViews);
	  }}
由於APPWidgetProvider繼承了BroadcastReceiver,因此APPWidgetProvider的本質還是一個BroadcastReceiver,為此需要在AndroidManifest.xml文件中使用<receiver.../>元素來配置它,配置該元素時需要為它指定相應的<intent-filter.../>和<meta-data.../>.
<receiver android:name=".DeskTopApp"
              android:label="@string/app_name"
              >
              <!-- 將該BroadcastReceiver當成桌面小控件 -->
              <intent-filter >
                    <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
              </intent-filter>
              <!-- 指定桌面小控件的meta-data -->
              <meta-data 
                    android:name="@android:appwidget.provider"
                    android:resource="@xml/appwidget_provider"/>
        </receiver>上面配置文件中指定該桌面小控件使用@xml/my_appwidget作為neta-data,因此還需要在應用的res\xml目錄下添加appwidget_provider.xml文件。該文件的內容如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- 指定該桌面組件的基本配置信息:
	   minWidth:桌面小控件的最小寬度
	   minHeight:桌面小控件的最小高度
	   updatePeriodMills:更新頻率
	   initialLayout:初始時顯示的佈局--><appwidget-provider 
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:minWidth="150dp"
      android:minHeight="50dp"
      android:updatePeriodMillis="1000"
      android:initialLayout="@layout/activity_desk_top_app"
      >
</appwidget-provider>