Launcher开发笔记5—添加控件

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

你可能感兴趣的:(Launcher)