去年公司做活动的时候写的,居然忘记发出来了。
产品:我们可以动态更换App在Launcher里面的Icon吗 开发:不可以 产品:我们可以动态更换App在Launcher里面的Icon吗 开发:不可以 产品:我们可以动态更换App在Launcher里面的Icon吗 开发:不可以 产品:我们可以动态更换App在Launcher里面的Icon吗 开发:让我想想……
首先利用activity-alias
<activity
android:name=".activity.SplashActivity"
android:hardwareAccelerated="true"
android:screenOrientation="portrait"
android:theme="@style/AppThemeTransparentBackground">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
<activity-alias
android:name=".activity.Test11"
android:enabled="false"
android:icon="@drawable/ic_au"
android:label="双11"
android:targetActivity=".activity.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity-alias>
<activity-alias
android:name=".activity.Test65"
android:enabled="false"
android:icon="@drawable/ic_sg"
android:label="UAT(65eday)"
android:targetActivity=".activity.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity-alias>
- activity-alias,即activity的别名
- name,即别名的名称
- enabled,即是否可用,默认 false 否则我们 app 会有多个入口
- icon,需要再在桌面显示的图片,即launcher icon
- lable,app 的名称。比如可用改成 ezbuy(65eday)
- targetActivity,即是哪个 activity 的别名。这里是我们的 launcher activity,
- 其余的照搬
利用PackageManager.setComponentEnabledSetting PackageManager是一个大统领类,可以管理所有的系统组件,当然,如果Root了,你还可以管理其它App的所有组件,一些系统优化工具就是通过这个方式来禁用一些后台Service的。
使用方式异常简单:
private void enableComponent(ComponentName componentName) {
mPm.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
private void disableComponent(ComponentName componentName) {
mPm.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
}
根据PackageManager.COMPONENT_ENABLED_STATE_ENABLED和PackageManager.COMPONENT_ENABLED_STATE_DISABLED这两个标志量和对应的ComponentName,就可以控制一个组件的是否启用.
然后调用方法就可以了
private void initLauncherIcon() {
ComponentName mDefault =getComponentName();
ComponentName mEday11 = new ComponentName(
getBaseContext(),
"com.xx.xx.activity.Test11");
ComponentName mEday65 = new ComponentName(
getBaseContext(),
"com.xx.xx.activity.Test65");
mPm = getApplicationContext().getPackageManager();
changeIcon65(mDefault, mEday65);
}
public void changeIcon65(ComponentName disable, ComponentName enable) {
disableComponent(disable);
enableComponent(enable);
}
但是这边会有问题,如果你换了图标以后的话,app 是退出。 所以我们在用户退出我们 app 的时候去调用这段代码就行了。