简单分析Android中添加shortcut方面的源码

首先要知道Launcher,就是主屏幕,它是Android系统启动后所加载的第一个程序,如下,主屏幕分成两部分,Workspace和Hotseats,而shortcut就是添加在workspace上的,这上面还可以添加诸如widget、文件夹等。这儿说的shortcut是指跳转到具体功能的快捷方式,而不是简单的程序的入口图标,APIDemos中有一个添加shortcut的例子,我们稍后分析它。

简单分析Android中添加shortcut方面的源码


这儿以Android2.3的模拟器分析添加shortcut有关的源码,要添加shortcut,一般是摁menu键选择Add或长摁主屏幕,弹出菜单选择相应的shortcut,如下:

简单分析Android中添加shortcut方面的源码

简单分析Android中添加shortcut方面的源码

关于获取Android的源码和将源码导入到eclipse中,可以参看我前面的文章,首先找到Launcher的源码,在<源码目录>\packages\apps\Launcher2下。

1、从manifest文件中可以知道主屏幕就是Launcher.java这个activity,可以看下其布局文件,找到onOptionsItemSelected()方法,跟下去在onCreateDialog()方法中

case DIALOG_CREATE_SHORTCUT:                   return new CreateShortcut().createDialog();  

找到create上左图这个dialog的代码,下面的方法是给dialog添加一个adapter,第二个参数是click事件的listener

builder.setAdapter(mAdapter, this);  

在其adapter中,发现其每一列就是个textview,通过:

textView.setCompoundDrawablesWithIntrinsicBounds(item.image, nullnullnull);  

这个方法可以在textview的左、上、右、下添加图片,无添加就为null。跟踪onclick()方法,在pickShortcut() 方法中:

Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);   ...   startActivityForResult(pickIntent, REQUEST_PICK_SHORTCUT);  

所以上右图其实是一个dialog样式的activity。

2、这个dialog样式的activity经常可以碰到,比如有时你点击一个链接,如果你装了多个浏览器,就会弹出这个activity让你选择哪个浏览器。其实就是ActivityPicker.java这个类。

跟踪其onCreate()方法:

// Build list adapter of pickable items    List<PickAdapter.Item> items = getItems();   mAdapter = new PickAdapter(this, items);  

跟踪getItems()方法,可以知道这个activityPicker中显示了两种数据,第一种便是上右图的第一项:

// Add any injected pick items    final Intent intent = getIntent();   ArrayList<String> labels = intent.getStringArrayListExtra(Intent.EXTRA_SHORTCUT_NAME);  

第二种便是在系统中查询一个Intent,就是上面一步中启动ActivityPicker的pickIntent中的name为Intent.EXTRA_INTENT的extraData,并且对其排序,是按照查询得出的activity的label或者name排序的:

List<ResolveInfo> list = packageManager.queryIntentActivities(baseIntent, 0 /* no flags */);   Collections.sort(list, new ResolveInfo.DisplayNameComparator(packageManager));  

所以系统中有Intent.ACTION_CREATE_SHORTCUT这个IntentFilter的activity都会显示在上右图中的列表中。

3、点击这个picker中ApiDemos,触发onclick(),会带着指向有Intent.ACTION_CREATE_SHORTCUT的activity的Intent返回到Launcher.java中。在onActivityResult()方法中跟下去:

case REQUEST_PICK_SHORTCUT:            processShortcut(data);            break;  

if中是处理如果你当时点击的是第一项Applications时会继续弹出一个ActivityPicker,列出所有安装程序的入口activity的快捷方式。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/2eda48e3b1e6b2dd68d600664b1675e2.html