1.Launcher为了让其他应用程序能够创建自己的快捷图标,就注册了一个BroadcastReceiver,专门接受其他应用程序发来的快捷图标创建信息。因此,我们只需要根据该broadcastReceiver构造出对应的Intent并装入我们的图标定制信息,最后调用sendBroadcat方法就可以创建一个快捷图标了。
2.首先查看一下android源码,在Launcher的AndroidManifest.xml文件中Install-ShortReceiver的注册信息。
<receiver android:name=".InstallShortReceiver"
android:permission="com.android.launcher.permission.INSTALL_SHORTCUT">
<intent-filter>
<action:android:name="com.android.launcher.action.INSTALL_SHORTCUT">
</intent-filter>
</receiver>
如何向这个BroadcastReceiver发送广播,设置如下:
a.应用程序必须要有com.android.launcher.permission.INSTALL权限。
b.要发送的广播的action为com.android.launcher.action.INSTALL_SHORTCUT
c.通过sendBroadcastReveiver就可以发送给Launcher的InstallShortCutReceiver了
3.快捷图标的信息是以附加信息的形式存储在广播出去的Intent对象中的,包括有图标、显示的名称以及用来启动目标组建的Intent这三种信息。我们可以通过putExtra()的重载方法设置相应的信息。
4.由于android 2.0之前和以后的版本Launcher包名有所区别,所以此处还需要判断一下当前sdk的版本,根据不同的版本,所对应的Uri也是不同的。
5.在创建快捷图标之前,还需要进行健壮性判断,如果已经存在,则不创建,否则,就进行创建。
完整代码:
private void createShortCut() {
// TODO Auto-generated method stub
//先判断该快捷是否存在
if(!isExist()){
Intent intent = new Intent();
//指定动作名称
intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
//指定快捷方式的图标
Parcelable icon = Intent.ShortcutIconResource.fromContext(this, R.drawable.congsmall);
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
//指定快捷方式的名称
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "应用快捷图标名");
//指定快捷图标激活哪个activity
Intent i = new Intent();
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName component = new ComponentName(this, MainActivity.class);
i.setComponent(component);
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, i);
sendBroadcast(intent);
}
}
private boolean isExist(){ boolean isExist = false; int version = getSdkVersion(); Uri uri = null; if(version < 2.0){ uri = Uri.parse("content://com.android.launcher.settings/favorites"); }else{ uri = Uri.parse("content://com.android.launcher2.settings/favorites"); } String selection = " title = ?"; String[] selectionArgs = new String[]{"应用快捷图标名"};//此处只是简单判断 Cursor c = getContentResolver().query(uri, null, selection, selectionArgs, null); if(c.getCount() > 0){ isExist = true; } c.close(); return isExist; } /** * 得到当前系统sdk版本 * @return */ private int getSdkVersion(){ return android.os.Build.VERSION.SDK_INT; }