Android動態更換應用圖示
一、背景
近日,微博官方釋出了一項新功能,即可以在App設定中動態更換微博的顯示圖示樣式。根據微博官方的說法,除了最原始的圖示外,微博還推出了另外10種不同的樣式,既有3D微博、炫彩微博等保留了眼睛造型的新樣式,也有乳酪甜馨、巧克力等以食物命名的“新口味”,還有夢幻紫、幻想星空等抽象派新造型,給了微博使用者多種選擇的自由。
不過需要注意的是,這一功能並不是面對所有人開放的,只有微博年費會員才能享受。此外,iOS 10.3及以上和Android 10及以上系統版本支援該功能,但是iPad與一加8Pro手機無法使用該功能。因部分手機存在系統差異,會導致該功能不可用,微博方面後續還會對該功能進行進一步優化。
二、技術實現
其實,說到底,上述功能用到的是動態更換桌面圖示的技術。如果說多年以前,實現圖示的切換還是一種時髦的技術,那麼,我們可以直接使用PackageManager就可以實現動態更換桌面圖示。
實現的細節是,在Manifest檔案中使用標籤準備多個Activity入口,沒個activity都指向入口Activity,並且為每個擁有標籤的activity設定單獨的icon和應用名,最後呼叫SystemService 服務kill掉launcher,並執行launcher的重啟操作。
首先,我們在AndroidManifest.xml檔案中新增如下程式碼:
```
<!-- 許可權-->
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
<application
android:allowBackup="true"
android:icon="@mipmap/wb_default_logo"
android:label="@string/app_name"
android:roundIcon="@mipmap/wb_default_logo"
android:supportsRtl="true"
android:theme="@style/Theme.AndroidDemo">
...//省略其他程式碼
<!-- 預設微博-->
<activity-alias
android:name="com.xzh.demo.default"
android:targetActivity=".MainActivity"
android:label="@string/app_name"
android:enabled="false"
android:icon="@mipmap/wb_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>
<!-- 3D微博-->
<activity-alias
android:name=".threedweibo"
android:targetActivity=".MainActivity"
android:label="@string/wb_3d"
android:enabled="false"
android:icon="@mipmap/wb_3dweibo"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
... //省略其他
</application>
``` 上面配置中涉及到的屬性如下: - android:name:註冊的元件名字,啟動元件的名稱。 - android:enabled:是否啟用這個元件,也就是是否顯示這個入口。 - android:icon:圖示 - android:label:名稱 - android:targetActivity:預設的activity沒有這個屬性,指定目標activity,與預設的activity中的name屬性是一樣的,需要有相應的java類檔案。
接著,我們在MainActivity觸發Logo圖示更換邏輯,程式碼如下:
```
class MainActivity : AppCompatActivity() {
var list: List
fun changeLogo(name: String) {
val pm = packageManager
pm.setComponentEnabledSetting(
componentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP
)
pm.setComponentEnabledSetting(
ComponentName(this, name),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP
)
reStartApp(pm)
}
fun reStartApp(pm: PackageManager) {
val am = getSystemService(ACTIVITY_SERVICE) as ActivityManager
val intent = Intent(Intent.ACTION_MAIN)
intent.addCategory(Intent.CATEGORY_HOME)
intent.addCategory(Intent.CATEGORY_DEFAULT)
val resolveInfos = pm.queryIntentActivities(intent, 0)
for (resolveInfo in resolveInfos) {
if (resolveInfo.activityInfo != null) {
am.killBackgroundProcesses(resolveInfo.activityInfo.packageName)
}
}
}
}
``
注意上面的changeLogo()方法中的字串需要和AndroidManifest.xml檔案中的
不過,測試的時候也遇到一些適配問題:
- 小米9:版本升級時,新版本在AndroidManifest中刪除A3,老版本切換圖示到A3,為解除安裝直接覆蓋安裝新版本,手機桌面圖示消失。
- magic 4:版本升級時,新版本在AndroidManifest中刪除A3,老版本切換圖示到A3,為解除安裝直接覆蓋安裝新版本,手機桌面圖示切換到預設圖示,但點選之後未能開啟APP。
- 騰訊開源垃圾清理軟體檸檬 Lemon
- RxDogTag:自動標記RxJava原始訂閱點
- 2021,位元組最值得關注的10個開源專案
- Google Colab 線上機器學習平臺使用教程
- 前端如何開始深度學習,那不妨試試JAX
- 高仿京東Android App,整合React-Native熱更功能
- 一文讀懂Kotlin的資料流
- Android動態更換應用圖示
- HTTP 3規範正式釋出
- 基於Linphone開發Android音影片通話
- 走進WWDC 2022蘋果開發者大會
- RN 基於Metro 拆包實戰
- H.264/H.265/H.266音影片編碼基礎
- Android AMS面試題
- Android車載應用開發之出識Android Automotive
- Android App跳轉微信小程式
- 匯出iphone手機安裝包的幾種方法
- iOS最新打包釋出流程
- 汽車軟體工程師如何使用Rust開發軟體系統
- Android 面試之必問Android基礎