管理快捷方式,系统提供的解决方案是通过Broadcast完成的,即我们发送创建或者删除的广播给系统,系统转给当前的桌面(LAUNCHER),进而….
1、首先需要声明以下权限:
//创建快捷方式
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
//删除快捷方式
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
2、另外就是要注意在快捷方式绑定的Activity的声明添加如下intent-filter。
<activity android:name=".TestActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
3、创建桌面快捷方式
指定快捷的名称,图标以及点击时的意图
/**
* 创建桌面快捷方式
*
* @param iconResId 图标的资源ID
* @param name 快捷方式的名字
* @param targetIntent 点击快捷的意图
* @param duplicate 是否允许重复创建
*/
public void createShortCut(int iconResId, String name, Intent targetIntent, boolean duplicate) {
//创建快捷方式的Intent
Intent shortcutintent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
//不允许重复创建
shortcutintent.putExtra("duplicate", duplicate);
//需要现实的名称
shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
//快捷图片
Parcelable icon = Intent.ShortcutIconResource.fromContext(getApplicationContext(),
iconResId);
shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
//点击快捷图片,运行的程序主入口
shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, targetIntent);
//发送广播。OK
sendBroadcast(shortcutintent);
}
4、删除快捷
注意此处的name和targetIntent,必须要和创建时一致。而且在小米系统上不管用,在三星上可以移除。
/**
* 移除桌面快捷方式
* 在小米系统上不管用,在三星上可以移除
*
* @param clazz 快捷所绑定的意图(页面)
* @param name 快捷方式的名字
*/
public void removeShortcut(Intent targetIntent, String name) {
// remove shortcut的方法在小米系统上不管用,在三星上可以移除
Intent intent = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT");
// 名字
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
// 设置关联程序
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, targetIntent);
// 发送广播
sendBroadcast(intent);
}
5、相关方法的整理
/**
* 创建桌面快捷方式,不允许重复创建,不传递参数
*
* @param iconResId 图标的资源ID
* @param name 快捷方式的名字
* @param targetActivity 点击快捷的目标页面
*/
public <T extends Activity> void createShortCut(int iconResId, String name,
Class<T> targetActivity) {
createShortCut(iconResId, name, targetActivity, null, false);
}
/**
* 创建桌面快捷方式
*
* @param iconResId 图标的资源ID
* @param name 快捷方式的名字
* @param targetIntent 点击快捷的意图
* @param duplicate 是否允许重复创建
*/
public void createShortCut(int iconResId, String name, Intent targetIntent, boolean duplicate) {
//创建快捷方式的Intent
Intent shortcutintent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
//不允许重复创建
shortcutintent.putExtra("duplicate", duplicate);
//需要现实的名称
shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
//快捷图片
Parcelable icon = Intent.ShortcutIconResource.fromContext(getApplicationContext(),
iconResId);
shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
//点击快捷图片,运行的程序主入口
shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, targetIntent);
//发送广播。OK
sendBroadcast(shortcutintent);
}
/**
* 创建桌面快捷方式
*
* @param iconResId 图标的资源ID
* @param name 快捷方式的名字
* @param targetActivity 点击快捷的目标页面
* @param extras 调至目标页面的参数信息
* @param duplicate 是否允许重复创建
*/
public <T extends Activity> void createShortCut(int iconResId, String name,
Class<T> targetActivity, Intent extras,
boolean duplicate) {
//传递参数
Intent targetIntent = new Intent(getApplicationContext(), targetActivity);
targetIntent.setAction("android.intent.action.MAIN");
if (extras != null) {
targetIntent.putExtras(extras);
}
createShortCut(iconResId, name, targetIntent, duplicate);
}
/**
* 移除桌面快捷方式
* 在小米系统上不管用,在三星上可以移除
* @param clazz 快捷所绑定的页面
* @param name 快捷方式的名字
*/
public <T extends Activity> void removeShortcut(Class<T> clazz, String name) {
// 设置关联程序
Intent targetIntent = new Intent(getApplicationContext(), clazz);
targetIntent.setAction("android.intent.action.MAIN");
removeShortcut(targetIntent, name);
}
/**
* 移除桌面快捷方式
* 在小米系统上不管用,在三星上可以移除
*
* @param clazz 快捷所绑定的意图(页面)
* @param name 快捷方式的名字
*/
public void removeShortcut(Intent targetIntent, String name) {
// remove shortcut的方法在小米系统上不管用,在三星上可以移除
Intent intent = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT");
// 名字
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
// 设置关联程序
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, targetIntent);
// 发送广播
sendBroadcast(intent);
}