Launcher.java中AppWidget增添过程分析

Launcher.java中AppWidget添加过程分析

1、首先、AppWidget添加的Dialog是通过长按出来的,所以查找onLongClick()方法,看到有showAddDialog(cellInfo);方法

2跳转到showAddDialog()方法看到showDialog(DIALOG_CREATE_SHORTCUT);是通过ActivityshowDilaog()显示一个dialog,所以找到onCreateDialog方法,

找到对应的dialogIDDIALOG_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就添加完成了。。。。。