需要注意的几点:
1。 必须调用AppWidgetHost的startListening方法来监听appwidget的状态变化,否则添加上去的appwidget不会更新的。
2。 需要override一个onActivityResult方法,来接收添加appwidget和appwidget的配置activity的返回值。
3。 启动AppWidgetManager.ACTION_APPWIDGET_PICK这个Intent,必须要给列表中加上自己定义的一个选项,否则出错。如本例中是用的Search。
No.1初始化
mAppWidgetHost = new AppWidgetHost(this, 1024);
mAppWidgetHost.startListening();
No.2 跳出控件选择对话框
// 为当前所在进程申请一个新的appWidgetId
int appWidgetId = mAppWidgetHost.allocateAppWidgetId();
// 显示所有能创建AppWidget的列表 发送此 ACTION_APPWIDGET_PICK 的Action
Intent pickIntent = new Intent(
AppWidgetManager.ACTION_APPWIDGET_PICK);
// 作为Intent附加值 , 该appWidgetId将会与选定的AppWidget绑定
pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
appWidgetId);
//选择某项AppWidget后,立即返回,即回调onActivityResult()方法
startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET);
No.3回调
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
case REQUEST_PICK_APPWIDGET:
// 选中了某个widget之后,根据是否有配置来决定直接添加还是弹出配置activity
addAppWidget(data);
break;
case REQUEST_CREATE_APPWIDGET:
// 完成对weight的添加
completeAddAppWidget(data);
break;
}
}
}
No.4选中一个weight之后回调操作
/**
* 选中了某个widget之后,根据是否有配置来决定直接添加还是弹出配置activity
*
* @param data
*/
void addAppWidget(Intent data) {
// TODO: catch bad widget exception when sent
int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
-1);
//如果配置了configure属性 , 即android:configure = "" ,需要再次启动该configure指定的类文件,通常为一个Activity
AppWidgetProviderInfo appWidget = mAppWidgetManager
.getAppWidgetInfo(appWidgetId);
// widget 包含设置信息不为空,则启动widget的设置界面
if (appWidget.configure != null) {
// Launch over to configure widget, if needed
Intent intent = new Intent(
AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
intent.setComponent(appWidget.configure);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
startActivityForResultSafely(intent, REQUEST_CREATE_APPWIDGET);
} else {
// widget 包含设置信息为空,直接添加widget到layout中
onActivityResult(REQUEST_CREATE_APPWIDGET, Activity.RESULT_OK, data);
}
}
No.5完成weight的添加
/**
* 选中了某个widget之后,根据是否有配置来决定直接添加还是弹出配置activity
*
* @param data
*/
void addAppWidget(Intent data) {
// TODO: catch bad widget exception when sent
int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
-1);
//如果配置了configure属性 , 即android:configure = "" ,需要再次启动该configure指定的类文件,通常为一个Activity
AppWidgetProviderInfo appWidget = mAppWidgetManager
.getAppWidgetInfo(appWidgetId);
// widget 包含设置信息不为空,则启动widget的设置界面
if (appWidget.configure != null) {
// Launch over to configure widget, if needed
Intent intent = new Intent(
AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
intent.setComponent(appWidget.configure);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
startActivityForResultSafely(intent, REQUEST_CREATE_APPWIDGET);
} else {
// widget 包含设置信息为空,直接添加widget到layout中
onActivityResult(REQUEST_CREATE_APPWIDGET, Activity.RESULT_OK, data);
}
}