探秘widget之launcher添加widget的流程分析

时间:2021-10-21 09:19:39

                                By 何明桂(http://blog.csdn.net/hmg25) 转载请注明出处

 

       最近打算研究下android的widget相关问题,并把一些心得在此稍作记录,哈哈,等研究完成了,如果有必要的话,也会把改动的源码贴出来,以飨读者。今天先来看看launcher2中添加widget的流程。

    添加widget首先需要在laucher的空白处长按,所以首先定位在laucher的 public boolean onLongClick(View v) 中,看到:

 

可以看到跳转到了showAddDialog(cellInfo),寻找到:

 

可以看到他携带着DIALOG_CREATE_SHORTCUT参数创建了一个Dialog,携带参数跳入Launcher.java的父类Activity.java的showDialog()方法,最终到达Launcher.java的onCreateDialog(int id)方法,代码如下:

 

跳转到了CreateShortcut()的createDialog()方法:

这里可以看到一个  AddAdapter类,跳转去看看,这个就是定义长按后出现的对话框的内容:

 

如果我们需要在原来的对话框中添加新的内容,那么首先需要修改的就是这里,我们回到之前的地方接着往下走,dialog响应的点击事件,public void onClick(DialogInterface dialog, int which) :

 

 

这里看到点击widget条目之后,跳转打开一个新的pickIntent,其实际运行的为packages/apps/Settings/src/com/android/settings/AppWidgetPickActivity.java:

先在onCreate方法中创建了一个InstalledAppWidgets列表,该列表就是我们在界面上能见到的所有widgets

在点击一个widgets,进入AppWidgetPickActivity.onClick事件监听,注意阅读该方法代码,它会进入else

 

activity执行结束后面都会进入launcher.onActivityResult,查看该函数方法有两个关键的case:

 

 

接着跳转到launcher的addAppWidget(Intent data)里data为传递来的appWidgetId:

 


通过onActivityResult(REQUEST_CREATE_APPWIDGET, Activity.RESULT_OK, data);跳转回launcher.onActivityResult的

 

 case REQUEST_CREATE_APPWIDGET:

          completeAddAppWidget(data, mAddItemCellInfo);

 

 

 

 completeAddAppWidget(data, mAddItemCellInfo)中完成widget的添加。