以前就有看到过supersu那个app里面可以设置应用图标,一直不是很了解它是怎么实现的,闲来无聊,反编译看了看manifest文件,发现它是使用了activity-alias来实现的,网上查找资料后,找到了大致可行的解决方案,主要包含以下几步:

1、通过配置activity-alias别名,将多个别名指向同一个Activity,该Activity是包含了android.intent.action.MAINandroid.intent.category.LAUNCHER的。

2、在AndroidManifest.xml文件中,把其他的activity-alias设置为 android:enabled=”true”,并设置不同的label和icon。

3、在代码中可以设置哪些Activity或者activity-alias是否可用。

主要部分代码如下:

Manifest文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<activity android:configChanges=”locale|keyboard|keyboardHidden|orientation|screenLayout|screenSize” android:excludeFromRecents=”true” android:exported=”true” android:hardwareAccelerated=”true” android:icon=”@drawable/transparent” android:label=”@string/appname_supersu” android:launchMode=”singleTask” android:name=”.MainActivity” android:noHistory=”false” android:theme=”@android:style/Theme.Translucent”>
<intent-filter>
<action android:name=”android.intent.action.MAIN”/>
</intent-filter>
</activity>
<activity-alias android:enabled=”true” android:icon=”@drawable/ic_launcher_emblem” android:label=”@string/appname_supersu” android:name=”.MainActivity-Emblem” 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:enabled=”false” android:icon=”@drawable/ic_launcher_superandy” android:label=”@string/appname_supersu” android:name=”.MainActivity-SuperAndy” android:targetActivity=”.MainActivity”>
<intent-filter>
<action android:name=”android.intent.action.MAIN”/>
<category android:name=”android.intent.category.LAUNCHER”/>
</intent-filter>
</activity-alias>

JAVA代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PackageManager pm = getApplicationContext().getPackageManager();
Context ctx = getApplicationContext();
ActivityManager am = (ActivityManager) ctx
.getSystemService(Activity.ACTIVITY_SERVICE);
System.out.println(getComponentName());
if (“com.ilovn.app.pictureprocess.TestAlias”.equals(getComponentName()
.getClassName())) {
pm.setComponentEnabledSetting(getComponentName(),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
pm.setComponentEnabledSetting(new ComponentName(getBaseContext(),
“com.ilovn.app.pictureprocess.SplashActivity”),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
} else {
pm.setComponentEnabledSetting(getComponentName(),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
pm.setComponentEnabledSetting(new ComponentName(getBaseContext(),
“com.ilovn.app.pictureprocess.TestAlias”),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}

记录备忘。