淘宝、微博都有默认图标,但是到了重大节日或者有重要活动的时候,它们的图标会相应的发生改变,这是怎么做到的呢?2.动态改变图标实现的关键是使用activity-alias,配置多个相....._android 动态更换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相对应。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。