在manifest.xml中,添加权限:
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
代码如下:
private void uninstallShortcut(){
Intent shortcut = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT");
//com.android.launcher.action.UNINSTALL_SHORTCUT
//快捷方式的名称
shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
shortcut.putExtra("duplicate", false);
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.setClass(getApplicationContext(), MainActivity.class);
shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,intent);
sendBroadcast(shortcut);
}
private void installShortcut(){
Log.i("CreateShortcutActivity","onclick to create shortcut");
Intent shortcutIntent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME,getString(R.string.app_name));
shortcutIntent.putExtra("duplicate", false);
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClass(getApplicationContext(), MainActivity.class);
shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(CreateShortcutActivity.this,
R.drawable.ic_shortcut));
sendBroadcast(shortcutIntent);
}
在android中,有InstallShortcutReceiver,和UninstallShortcutReceiver两个类,用来接收该广播。
注意:shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
在InstallShortcutReceiver中,如果intent没有设置action的话,会添加Intent.ACTION_VIEW,造成在Remove shortcut的时候,比较两个Intent时,可能不一致而无法删除该shortcut.
所以,建议要自己添加ACTION.
附上android Intent.filterEquals().就是这方法用来比较前后两个Intent的,
/**
* Determine if two intents are the same for the purposes of intent
* resolution (filtering). That is, if their action, data, type,
* class, and categories are the same. This does <em>not</em> compare
* any extra data included in the intents.
*
* @param other The other Intent to compare against.
*
* @return Returns true if action, data, type, class, and categories
* are the same.
*/
public boolean filterEquals(Intent other) {
if (other == null) {
return false;
}
if (mAction != other.mAction) {
if (mAction != null) {
if (!mAction.equals(other.mAction)) {
return false;
}
} else {
if (!other.mAction.equals(mAction)) {
return false;
}
}
}
if (mData != other.mData) {
if (mData != null) {
if (!mData.equals(other.mData)) {
return false;
}
} else {
if (!other.mData.equals(mData)) {
return false;
}
}
}
if (mType != other.mType) {
if (mType != null) {
if (!mType.equals(other.mType)) {
return false;
}
} else {
if (!other.mType.equals(mType)) {
return false;
}
}
}
if (mPackage != other.mPackage) {
if (mPackage != null) {
if (!mPackage.equals(other.mPackage)) {
return false;
}
} else {
if (!other.mPackage.equals(mPackage)) {
return false;
}
}
}
if (mComponent != other.mComponent) {
if (mComponent != null) {
if (!mComponent.equals(other.mComponent)) {
return false;
}
} else {
if (!other.mComponent.equals(mComponent)) {
return false;
}
}
}
if (mCategories != other.mCategories) {
if (mCategories != null) {
if (!mCategories.equals(other.mCategories)) {
return false;
}
} else {
if (!other.mCategories.equals(mCategories)) {
return false;
}
}
}
return true;
}
可见,flag属性是不在比较之列的,可以任意添加