需要注意的几点:
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); } }