每當(dāng)雙11或者節(jié)假日,安卓的桌面圖標(biāo)會(huì)更換成帶有節(jié)日元素的 icon,今天一探究竟,如何實(shí)現(xiàn)的。
需要用到的知識(shí):activity-alias
alias 英 [?e?li?s] 美 [?eli?s, ?elj?s]
n. 別名,化名;
顧名思義,activity-alias并不是代表一個(gè)Activity,而是代表一個(gè)已經(jīng)存在的Activity的別名。
它使用在清單文件中,類似Activity標(biāo)簽。它可用來(lái)設(shè)置某個(gè)Activity的快捷入口
activity-alias基本用法
<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>
-
屬性說(shuō)明
屬性表
代碼示例
<activity-alias
android:name=".ui.jingdong618"
android:enabled="false"
android:icon="@mipmap/normal_listner"
android:label="切換名稱1"
android:targetActivity=".ui.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
- activity-alias 可以預(yù)存多個(gè),然后根據(jù)條件去替換對(duì)應(yīng)的icon,及設(shè)置桌面app 名稱
<activity
android:name=".ui.MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:launchMode="singleTask"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- - - -在Activity 中:
// 聲明 要替換的別名
String currentString = "com.qhpc.fangzhou.ui.jingdong618";
// 替換方法
public void changeIcon(String activityPath) {
PackageManager pm = getPackageManager();
pm.setComponentEnabledSetting(getComponentName(),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
pm.setComponentEnabledSetting(new ComponentName(this, activityPath),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
//重啟桌面 加速顯示
// restartSystemLauncher(pm);
}
public void restartSystemLauncher(PackageManager pm) {
ActivityManager am = (ActivityManager) 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);
}
}
}
@Override
protected void onDestroy() {
changeIcon();
super.onDestroy();
}
說(shuō)明:
- 我們依賴后端接口告知我們需要替換桌面icon了,這時(shí)候,我們將預(yù)先放置的icon 對(duì)應(yīng)的別名 currentString 賦值,然后存在本地(sharePreference )存儲(chǔ),為空才去替換, 放在啟動(dòng)頁(yè)的onDestroy 方法中去替換是考慮到,這樣替換的話跟隨用戶手動(dòng)退出操作就做了桌面icon的替換,用戶無(wú)感知;
代碼傳送門(mén) https://github.com/peterQin0826/AutoChangeIcon.git
