Android 动态更换app图标

  • Post author:
  • Post category:其他


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相对应。



版权声明:本文为zenmela2011原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。