前言
??電商項(xiàng)目遇到節(jié)日三娩,如果內(nèi)容上沒(méi)有變更,只是需要更換應(yīng)用icon和名稱(chēng)順應(yīng)節(jié)日抑钟。不可能去發(fā)一個(gè)版本涯曲,成本太高,所以可以動(dòng)態(tài)的去修改應(yīng)用的icon和name在塔;
思想
??應(yīng)用集成推送幻件,當(dāng)節(jié)日的時(shí)候收到推送,在后臺(tái)默默的修改掉icon和名稱(chēng)蛔溃,使用activity-alias來(lái)配置绰沥。
activity-alias語(yǔ)法及聲明
<activity-alias android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:targetActivity="string" >
. . .
</activity-alias>
1. android:enable 該屬性用來(lái)決定目標(biāo)Activity可否通過(guò)別名被系統(tǒng)實(shí)例化,默認(rèn)為true贺待;需要注意的是application也有enable屬性徽曲,只用當(dāng)它們同時(shí)為true時(shí),activity-alias的enable才生效狠持。
2. android:exported 該屬性為true的話疟位,則目標(biāo)Activity可被其他應(yīng)用調(diào)起,如為false則只能被應(yīng)用自身調(diào)起喘垂;其默認(rèn)值根據(jù)activity-alias是否包含intent-filter元素決定甜刻,如果有的話,則默認(rèn)為true正勒,沒(méi)有的話則為false得院;其實(shí)也很好理解,如果有intent-filter章贞,則目標(biāo)Activity可以匹配隱式Intent祥绞,因此可被外部應(yīng)用喚起;如果沒(méi)有intent-filter,則目標(biāo)Activity要被調(diào)起的話必須知道其精確類(lèi)名蜕径,因?yàn)橹挥袘?yīng)用本身才知道精確類(lèi)名两踏,所以此時(shí)默認(rèn)為false。
3. android:icon 該屬性就比較好玩了兜喻,允許自定義icon梦染,可以不同于應(yīng)用本身在桌面的icon;如果需要在桌面上創(chuàng)建快捷入口朴皆,也許產(chǎn)品會(huì)要求換個(gè)不同的icon帕识。
4. android:label 該屬性類(lèi)似于android:icon,圖標(biāo)都換了遂铡,換個(gè)名稱(chēng)也合情合理吧肮疗,此屬性就是為此而生的。
5. android:name 該屬性可以為任意字符串扒接,但最好符合類(lèi)名命名規(guī)范伪货;activity元素的name屬性實(shí)質(zhì)上都會(huì)指向一個(gè)具體的Activity類(lèi),而activity-alias的name屬性?xún)H作為一個(gè)唯一標(biāo)識(shí)而已钾怔。
6. android:permission 該屬性指明了通過(guò)別名聲明調(diào)起目標(biāo)Activity所必需的權(quán)限超歌。
7. android:targetActivity 該屬性指定了目標(biāo)Activity,即通過(guò)activity-alias調(diào)起的Activity是哪個(gè)蒂教,此屬性其實(shí)類(lèi)似于activity標(biāo)簽中的name屬性,需要規(guī)范的Activity包名類(lèi)名脆荷。
activity-alias用法示例
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity-alias
android:name="com.example.zcj.dynamicondemo.MainActivityAlias1"
android:enabled="false"
android:icon="@mipmap/ic_launcher"
android:label="aaa"
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:name="com.example.zcj.dynamicondemo.MainActivityAlias2"
android:enabled="false"
android:label="bbb"
android:icon="@mipmap/ic_launcher_round"
android:targetActivity=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
</application>
動(dòng)態(tài)設(shè)置顯示哪個(gè)
private static final String ACTIVITY_ALIAS = "com.example.zcj.dynamicondemo.MainActivity";
private static final String ACTIVITY_ALIAS_1 = "com.example.zcj.dynamicondemo.MainActivityAlias1";
private static final String ACTIVITY_ALIAS_2 = "com.example.zcj.dynamicondemo.MainActivityAlias2";
private void setIcon(String activity_alias) {
Context ctx = getApplication();
PackageManager pm = ctx.getPackageManager();
pm.setComponentEnabledSetting(
new ComponentName(ctx, ACTIVITY_ALIAS),
ACTIVITY_ALIAS.equals(activity_alias) ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
pm.setComponentEnabledSetting(
new ComponentName(ctx, ACTIVITY_ALIAS_1),
ACTIVITY_ALIAS_1.equals(activity_alias) ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
pm.setComponentEnabledSetting(
new ComponentName(ctx, ACTIVITY_ALIAS_2),
ACTIVITY_ALIAS_2.equals(activity_alias) ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
Toast.makeText(this, activity_alias, Toast.LENGTH_LONG).show();
//干掉桌面app凝垛,讓它自動(dòng)重啟。
ActivityManager am = (ActivityManager) ctx.getSystemService(Activity.ACTIVITY_SERVICE);
Intent i = new Intent(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_HOME);
i.addCategory(Intent.CATEGORY_DEFAULT);
List<ResolveInfo> resolves = pm.queryIntentActivities(i, 0);
for (ResolveInfo res : resolves) {
if (res.activityInfo != null) {
am.killBackgroundProcesses(res.activityInfo.packageName);
}
}
}
PackageManager.COMPONENT_ENABLED_STATE_ENABLED 顯示
PackageManager.COMPONENT_ENABLED_STATE_DISABLED 隱藏