21天学习挑战赛--第三天打卡(动态更换app图标)

1.图标设置

app图标一般都是设置在Android manifest.xml文件里application的icon属性里,如下:

Android manifest.xml:

<application

    android:icon="mipmap/ic_launcher"

    ……>

淘宝、微博都有默认图标,但是到了重大节日或者有重要活动的时候,它们的图标会相应的发生改变,这是怎么做到的呢?

2.动态改变图标

实现的关键是使用activity-alias,配置多个相同activity。

实现流程为:在Manifest文件中使用activity-alias标签准备多个Activity入口,每个activity都指向入口Activity,并且为每个拥有activity-alias标签的activity设置单独的icon和应用名,最后调用SystemService 服务kill掉launcher,并执行launcher的重启操作。

①首先,修改AndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.demo.test">

    <!-- 权限-->

    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>

    <application

        android:allowBackup="true"

        android:icon="@mipmap/default_logo"

        android:label="@string/app_name"

        android:roundIcon="@mipmap/default_logo"

        ……>

       ...

        <!-- 默认图标-->

        <activity-alias

            android:name="com.demo.test.default"

            android:targetActivity=".MainActivity"

            android:label="@string/app_name"

            android:enabled="false"

            android:icon="@mipmap/default_logo"

            android:exported="true">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity-alias>

        

        <!-- 活动图标-->

        <activity-alias

            android:name="com.demo.test.special"

            android:targetActivity=".MainActivity"

            android:label="@string/special"

            android:enabled="false"

            android:icon="@mipmap/special_logo"

            android:exported="true">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity-alias>

        ... 

    </application>

</manifest>

其中涉及到的属性:

android:name:注册的组件名字,启动组件的名称。

android:enabled:是否启用这个组件,即是否显示这个入口。

android:icon:图标

android:label:名称

android:targetActivity:默认的activity没有这个属性,指定目标activity,与默认的activity中的name属性是一样的,需要有相应的java类文件。

注:

(1)activity-alias需要在activity下面,enabled为false,否则桌面会有两个图标

(2)activity-alias下的name随意,但targetActivity需要是上面activity的name

(3)在这配置要换的icon和label

(4)android:exported都需要为true。默认为true

②在MainActivity触发Logo图标更换逻辑:

private void changeIcon(String name){

    PackageManager pm = getPackageManager();

    pm.setComponentEnabledSetting( getComponentName(),PackageManager.COMPO NENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

    pm.setComponentEnabledSetting(new ComponentName(this, name), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

    restart(pm);

}

注意changeIcon()方法中的name字符串需要和AndroidManifest.xml文件中的<activity-alias>的name相对应。

猜你喜欢

转载自blog.csdn.net/zenmela2011/article/details/126183963