1. <?xml version="1.0" encoding="UTF-8"?>
  2. <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:minWidth="60dp"
  4. android:minHeight="30dp"
  5. android:updatePeriodMillis="86400000"
  6. android:initialLayout="@layout/main">
  7. </appwidget-provider>
<?xml version="1.0" encoding="UTF-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="60dp"
    android:minHeight="30dp"
    android:updatePeriodMillis="86400000"     
    android:initialLayout="@layout/main">
</appwidget-provider>

android:initialLayout="@layout/main" 此句为指定桌面组件的布局文件。

android:updatePeriodMillis="86400000"指定刷新时间间隔(单位:ms),每隔android:updatePeriodMillis就调用onUpdate方法。另,如果android:updatePeriodMillis为0,则表示不刷新。

android:minWidth最小宽度
android:minHeight最小高度

可以根据所占单元格数计算android:minWidth和android:minHeight。

计算公式(宽高皆适用):(单元个数*74)-2。由于像素计算会造成一定的偏差,所以最后值减2。另,屏幕最大单元格数位4*4。

2.写一个类继承自AppWidgetProvider

[java] view plain copy print ?

  1. public class widgetProvider extends
public class widgetProvider extends AppWidgetProvider

并重写两个方法

[java] view plain copy print ?

  1. @Override
  2. public void
  3. int[] appWidgetIds) {}  
  4.   
  5. @Override
  6. public void
@Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {}

@Override
    public void onReceive(Context context, Intent intent) {}

onUpdate 为组件在桌面上生成时调用,并更新组件UI,onReceiver 为接收广播时调用更新UI,一般这两个方法是比较常用的。

3.后台注册Receiver

[html] view plain copy print ?

  1. <receiver android:name=".widgetProvider">
  2. <meta-data android:name="android.appwidget.provider"
  3. android:resource="@xml/appwidget_provider"></meta-data>
  4. <intent-filter>
  5. <action android:name="com.terry.action.widget.click"></action>
  6. <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  7.                    
  8. </intent-filter>
  9. </receiver>
<receiver android:name=".widgetProvider">
            <meta-data android:name="android.appwidget.provider"
                android:resource="@xml/appwidget_provider"></meta-data>
            <intent-filter>
                <action android:name="com.terry.action.widget.click"></action>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                 
            </intent-filter>
        </receiver>

上面代码中比较重要的是这一句 <meta-data android:name="android.appwidget.provider"  android:resource="@xml/appwidget_provider"></meta-data>  大意为指定桌面应用程序的AppWidgetProvderInfo  文件,使其可作其管理文件。

4.使app widget组件支持点击事件

[java] view plain copy print ?

  1. public static void
  2. int
  3. new
  4. new
  5. 0,  
  6. 0);  
  7.         rv.setOnClickPendingIntent(R.id.TextView01, pendingIntent);  
  8.         appWidgeManger.updateAppWidget(appWidgetId, rv);  
  9.     }  
public static void updateAppWidget(Context context,
            AppWidgetManager appWidgeManger, int appWidgetId) {
        rv = new RemoteViews(context.getPackageName(), R.layout.main);
        Intent intentClick = new Intent(CLICK_NAME_ACTION);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
                intentClick, 0);
        rv.setOnClickPendingIntent(R.id.TextView01, pendingIntent);
        appWidgeManger.updateAppWidget(appWidgetId, rv);
    }

此方法为创建组件时 onUpdate 调用的更新UI的方法,代码中使用RemoteView 找到组件的布局文件,同时为其设置广播接收器CLICK_NAME_ACTION并且通过RemoteView 的setOnClickPendingIntent 方法找到我想触发事件的TextView 为其设置广播。接着在onReceiver 中通过判断传进来的广播来触发动作。

[java] view plain copy print ?

    1. @Override
    2. public void
    3. // TODO Auto-generated method stub 
    4. super.onReceive(context, intent);  
    5.   
    6. if (rv == null) {  
    7. new
    8.         }  
    9. if
    10. if
    11.                 rv.setTextViewText(R.id.TextView01, context.getResources()  
    12.                         .getString(R.string.load));  
    13.   
    14. else
    15.                 rv.setTextViewText(R.id.TextView01, context.getResources()  
    16.                         .getString(R.string.change));  
    17.   
    18.             }  
    19.             Toast.makeText(context, Boolean.toString(uitil.isChange),  
    20.                     Toast.LENGTH_LONG).show();  
    21.             uitil.isChange = !uitil.isChange;  
    22.   
    23.         }  
    24.         AppWidgetManager appWidgetManger = AppWidgetManager  
    25.                 .getInstance(context);  
    26. int[] appIds = appWidgetManger.getAppWidgetIds(new
    27. class));  
    28.         appWidgetManger.updateAppWidget(appIds, rv);