一、为widget添加点击事件
在继承自AppWidgetProvider类的onUpdate方法中添加监听并发送点击事件:
Intent actClick=new Intent("com.zwq.taskMan");
PendingIntent pending= PendingIntent.getBroadcast(context, 0, actClick, 0);
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget);
rv.setOnClickPendingIntent(R.id.kill_all_image,
pending);
appWidgetManager.updateAppWidget(appWidgetIds, rv);
还必须在AndroidManifest.xml的receiver中添加相应的动作:
<action android:name="com.zwq.taskMan"></action>
这样就可以在onReceive方法中通过
if ("com.zwq.taskMan".equals(intent.getAction())) {
}过滤到发送的监听事件了,在这儿可以做相应的事件处理。
二、点击widget时启动一个Activity:
// Push newly updated widget to surface
RemoteViews views = PhotoAppWidgetProvider.buildUpdate(this,mAppWidgetId, helper);
// Intent actionIntent=new Intent(INTENT_FLAG);
// PendingIntent pending= PendingIntent.getBroadcast(this, 0, actionIntent, 0);
Intent actionIntent = new Intent(PhotoAppWidgetConfigure.this, Photo.class);
PendingIntent pending = PendingIntent.getActivity(this, 0, actionIntent, 0);
views.setOnClickPendingIntent(R.id.photo, pending);
可以将这个Widget的id传递给该Activity:
Bundle value = new Bundle();
value.putInt(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
actionIntent.putExtras(value);
三、一个程序显示多个Widget,如果程序需要显示不同尺寸的widget,可以配置多个widget,具体就是要有多个provider,然后在androidmenifist里面配置多个receive:
<receiver android:name=".PhotoProviderTwo" android:label="two">
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/appwidget_info_two"/>
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
</receiver>
<receiver android:name=".PhotoProviderThree" android:label="three">
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/appwidget_info_three"/>
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
</receiver>
<receiver android:name=".PhotoProviderFour" android:label="four">
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/appwidget_info_four"/>
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
</receiver>
四、更新Widget的图片:
只要在AppWidgetProvider的onReceive方法里面写上更新的代码即可:
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Common.WIDGET_UPDATE_PHOTO)) {
Bundle b=intent.getExtras();
String path=b.getString(Common.CURRENT_PHOTO_PATH);
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.photo_frame);
BitmapTool get = new BitmapTool();
Bitmap bitmap = get.getBitmap(path);
bitmap = Bitmap.createBitmap(bitmap);
views.setImageViewBitmap(R.id.widget_photo, bitmap);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
appWidgetManager.updateAppWidget(new ComponentName(context,PhotoProviderThree.class), views);
}
super.onReceive(context, intent);
}
特别注意:
当使用
views.setImageViewResource(R.id.widget_photo, R.drawable.background);
更新时,没什么问题,View里面的图片可以完全更新,这样图片只能来自程序本身自带的。如果需要使用程序以外的图片就要用到:
views.setImageViewBitmap(R.id.widget_photo, bitmap);
这是要注意添加:
bitmap = Bitmap.createBitmap(bitmap);
不然图片是不会更新的。还有就是图片不能太大,如果太大也是不能更新的!
具体问题参考老外的文章:http://code.google.com/p/android/issues/detail?id=8489
http://eyes-free.googlecode.com/svn/trunk/androidsays/src/com/google/marvin/androidsays/WidgetInterface.java
五、Widget不错的参考资料:
http://hi.baidu.com/tdskee/blog/item/3459249b3a6da1a1c9eaf4bc.html
http://hi.baidu.com/tdskee/blog/item/575bbcaf758559d87cd92abe.html