1.创建桌面快捷方式
/**
* 创建快捷方式
*/
private void createShortcut() {
try {
boolean isExit = ShortcutUtils.isShortCutExist(getApplicationContext(), "APPNAME");
if (!isExit) {
// 当前不存在桌面快捷方式,手动创建一个
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setComponent(new ComponentName(this, MainActivity.getLauncherComponentName(this)));
Bitmap icon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
ShortcutUtils.addShortcut(MainActivity.this, intent, "APPNAME", false, icon);
}
} catch (Exception e) {
}
}
2.先看一张截图
- 1.我的项目ChangeLauncherIcon图标有个白色背景包裹,美团也是。
- 2.这是因为项目是在Android Studio 2.0时创建的,那么现在使用Android Studio 3.0创建项目时会自动生成mipmap-anydpi-v26文件夹,它是适配API26+的,在Android 8.0+上生效。
3.适配Android8.0+
- 1.我们的项目中没有,只需新建它,建一个文件ic_launcher,里面的内容为
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
2.把ic_launcher_background.png(背景)和ic_launcher_foreground.png(前景)两张图片放入drawable-xxhdpi中
3.此时再运行就会正常,如下图
4.为了满足用户个性化需求,增加了自由改变桌面图标形状的功能
1.快捷方式集合
public enum Launcher {
Launcher_Default("系统默认图标", "com.gss.changelaunchericon.MainActivity"),
Launcher_Round("圆形图标", "com.gss.changelaunchericon.MainActivity2"),
Launcher_Rect("圆角矩形图标", "com.gss.changelaunchericon.MainActivity3");
String name;
String componentName;
Launcher(String name, String componentName) {
this.name = name;
this.componentName = componentName;
}
}
2.配置清单文件中的MainActivity2和MainActivity3
<activity-alias
android:name=".MainActivity2"
android:enabled="false"
android:exported="true"
android:icon="@mipmap/ic_launcher_round"
android:label="@string/app_name"
android:targetActivity=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
<activity-alias
android:name=".MainActivity3"
android:enabled="false"
android:exported="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:targetActivity=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
3.其余代码已上传github,大家可以下载,链接在底部
public static String getLauncherComponentName(Context context) {
try {
int stateDefault = context.getPackageManager().getComponentEnabledSetting(new ComponentName(PACKAGE_NAME, Launcher.Launcher_Default.componentName));
int stateRect = context.getPackageManager().getComponentEnabledSetting(new ComponentName(PACKAGE_NAME, Launcher.Launcher_Rect.componentName));
int stateRound = context.getPackageManager().getComponentEnabledSetting(new ComponentName(PACKAGE_NAME, Launcher.Launcher_Round.componentName));
if (stateDefault == PackageManager.COMPONENT_ENABLED_STATE_ENABLED || stateDefault == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
return Launcher.Launcher_Default.componentName;
} else if (stateRect == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
return Launcher.Launcher_Rect.componentName;
} else if (stateRound == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
return Launcher.Launcher_Round.componentName;
} else {
context.getPackageManager().setComponentEnabledSetting(new ComponentName(PACKAGE_NAME, Launcher.Launcher_Default.componentName),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
return Launcher.Launcher_Default.componentName;
}
} catch (Exception e) {
return Launcher.Launcher_Default.componentName;
}
}