安卓app桌面快捷方式(创建,适配,自由选择形状)

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;
    }
}

Github地址

猜你喜欢

转载自blog.csdn.net/qq_35733332/article/details/80340306