1、首先、AppWidget添加的Dialog是通过长按出来的,所以查找onLongClick()方法,看到有showAddDialog(cellInfo);方法
2、跳转到showAddDialog()方法看到showDialog(DIALOG_CREATE_SHORTCUT);是通过Activity的showDilaog()显示一个dialog,所以找到onCreateDialog方法,
找到对应的dialog的ID(DIALOG_CREATE_SHORTCUT),看到如下代码:
case DIALOG_CREATE_SHORTCUT: return new CreateShortcut().createDialog();
3、再跳转到CreateShortCut这个内部类,可以发现长按的菜单就是从这里创建的,
在onClick方法中有对窗口小部件项的点击处理。代码如下:
int appWidgetId = Launcher.this.mAppWidgetHost.allocateAppWidgetId(); Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK); pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId); // start the pick activity startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET);
通过intent启动了一个activity,AppWidgetManager.Action_APPWIDGET_PICK这个action是启动settings(设置)中的AppWidgetPickActivity.java的activity,列出系统已经安装了的AppWidget,并将用户选择的AppWidget和传送进来的AppWidgetId进行绑定,(绑定这里要强调一下,绑定是通过AppWidgetManager中的bindAppWidgetId(id, provider)方法进行绑定的,此方法需要系统权限才可以执行,设置是有系统权限的,所以想要后台代码添加widget到自已写的launcher中时,launcher必须得有系统权限,否则不可以后台代码添加widget)。
4、选择widget后再加到Launcher.java中看onActivityResult
case REQUEST_PICK_APPWIDGET: addAppWidget(data);
再跳转到addAppWidget方法,if (appWidget.configure != null)是判断该widget是否有设置,如果有设置,则先跳转到设置界面,若没有设置则直接执行completeAddAppWidget()方法,将widget添加到桌面有桌面数据库中。
这样一个AppWidget就添加完成了。。。。。