Android動(dòng)態(tài)更換應(yīng)用圖標(biāo)詳情
一、背景
近日,微博官方發(fā)布了一項(xiàng)新功能,即可以在App設(shè)置中動(dòng)態(tài)更換微博的顯示圖標(biāo)樣式。根據(jù)微博官方的說(shuō)法,除了最原始的圖標(biāo)外,微博還推出了另外10種不同的樣式,既有3D微博、炫彩微博等保留了眼睛造型的新樣式,也有奶酪甜馨、巧克力等以食物命名的“新口味”,還有夢(mèng)幻紫、幻想星空等抽象派新造型,給了微博用戶多種選擇的自由。
不過(guò)需要注意的是,這一功能并不是面對(duì)所有人開(kāi)放的,只有微博年費(fèi)會(huì)員才能享受。此外,iOS 10.3及以上和Android 10及以上系統(tǒng)版本支持該功能,但是iPad與一加8Pro手機(jī)無(wú)法使用該功能。因部分手機(jī)存在系統(tǒng)差異,會(huì)導(dǎo)致該功能不可用,微博方面后續(xù)還會(huì)對(duì)該功能進(jìn)行進(jìn)一步優(yōu)化。
二、技術(shù)實(shí)現(xiàn)
其實(shí),說(shuō)到底,上述功能用到的是動(dòng)態(tài)更換桌面圖標(biāo)的技術(shù)。如果說(shuō)多年以前,實(shí)現(xiàn)圖標(biāo)的切換還是一種時(shí)髦的技術(shù),那么,我們可以直接使用PackageManager就可以實(shí)現(xiàn)動(dòng)態(tài)更換桌面圖標(biāo)。
實(shí)現(xiàn)的細(xì)節(jié)是,在Manifest文件中使用標(biāo)簽準(zhǔn)備多個(gè)Activity入口,沒(méi)個(gè)activity都指向入口Activity,并且為每個(gè)擁有標(biāo)簽的activity設(shè)置單獨(dú)的icon和應(yīng)用名,最后調(diào)用SystemService 服務(wù)kill掉launcher,并執(zhí)行l(wèi)auncher的重啟操作。
首先,我們?cè)贏ndroidManifest.xml文件中添加如下代碼:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.xzh.demo"> <!-- 權(quán)限--> <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"> ...//省略其他代碼 <!-- 默認(rèn)微博--> <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> </manifest>
上面配置中涉及到的屬性如下:
- android:name:注冊(cè)的組件名字,啟動(dòng)組件的名稱。
- android:enabled:是否啟用這個(gè)組件,也就是是否顯示這個(gè)入口。
- android:icon:圖標(biāo)
- android:label:名稱
- android:targetActivity:默認(rèn)的activity沒(méi)有這個(gè)屬性,指定目標(biāo)activity,與默認(rèn)的activity中的name屬性是一樣的,需要有相應(yīng)的java類文件。
接著,我們?cè)贛ainActivity觸發(fā)Logo圖標(biāo)更換邏輯,代碼如下:
class MainActivity : AppCompatActivity() { var list: List<LogoBean> = ArrayList() var recyclerView: RecyclerView? = null var adapter: LogoAdapter? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) initView() initData() initRecycle() } private fun initView() { recyclerView = findViewById(R.id.recycle_view) } private fun initData() { list = Arrays.asList( LogoBean(R.mipmap.wb_default_logo, "默認(rèn)圖標(biāo)", true), LogoBean(R.mipmap.wb_3dweibo, "3D微博", false), LogoBean(R.mipmap.wb_cheese_sweetheart, "奶酪甜心", false), LogoBean(R.mipmap.wb_chocolate_sweetheart, "巧克力", false), LogoBean(R.mipmap.wb_clear_colorful, "清透七彩", false), LogoBean(R.mipmap.wb_colorful_sunset, "多彩日落", false), LogoBean(R.mipmap.wb_colorful_weibo, "炫彩微博", false), LogoBean(R.mipmap.wb_cool_pool, "清涼泳池", false), LogoBean(R.mipmap.wb_fantasy_purple, "夢(mèng)幻紫", false), LogoBean(R.mipmap.wb_fantasy_starry_sky, "幻想星空", false), LogoBean(R.mipmap.wb_hot_weibo, "熱感微博", false), ) } private fun initRecycle() { adapter =LogoAdapter(this,list); val layoutManager = GridLayoutManager(this, 3) recyclerView?.layoutManager = layoutManager recyclerView?.adapter = adapter adapter?.setOnItemClickListener(object : OnItemClickListener { override fun onItemClick(view: View?, position: Int) { if(position==1){ changeLogo("com.xzh.demo.threedweibo") }else if (position==2){ changeLogo("com.xzh.demo.cheese") }else if (position==3){ changeLogo("com.xzh.demo.chocolate") }else { changeLogo("com.xzh.demo.default") } } }) } 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文件中的<activity-alias>
的name相對(duì)應(yīng)。運(yùn)行上面的代碼,然后點(diǎn)擊應(yīng)用中的某個(gè)圖標(biāo),就可以更換應(yīng)用的桌面圖標(biāo),
如下圖所示:
不過(guò),測(cè)試的時(shí)候也遇到
一些適配問(wèn)題:
- 小米9:版本升級(jí)時(shí),新版本在AndroidManifest中刪除A3,老版本切換圖標(biāo)到A3,為卸載直接覆蓋安裝新版本,手機(jī)桌面圖標(biāo)消失。
- magic 4:版本升級(jí)時(shí),新版本在AndroidManifest中刪除A3,老版本切換圖標(biāo)到A3,為卸載直接覆蓋安裝新版本,手機(jī)桌面圖標(biāo)切換到默認(rèn)圖標(biāo),但點(diǎn)擊之后未能打開(kāi)APP。
到此這篇關(guān)于Android動(dòng)態(tài)更換應(yīng)用圖標(biāo)詳情的文章就介紹到這了,更多相關(guān)Android更換圖標(biāo)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android DownloadMananger管理器實(shí)現(xiàn)下載圖片功能
Android DownloadMananger類似于下載隊(duì)列,管理所有當(dāng)前正在下載或者等待下載的項(xiàng)目,他可以維持HTTP鏈接,并且在隊(duì)列中的下載項(xiàng)目一旦失敗,還能自動(dòng)重新下載2023-01-01關(guān)于OkHttp中response.body().string()的用法解析
這篇文章主要介紹了關(guān)于OkHttp中response.body().string()的用法解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Flutter實(shí)現(xiàn)下拉刷新和上拉加載更多
這篇文章主要為大家詳細(xì)介紹了Flutter實(shí)現(xiàn)下拉刷新和上拉加載更多,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08Android開(kāi)發(fā)實(shí)現(xiàn)自定義Toast、LayoutInflater使用其他布局示例
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)自定義Toast、LayoutInflater使用其他布局,涉及Android自定義Toast與界面布局相關(guān)操作技巧,需要的朋友可以參考下2019-03-03Android SDK Manager更新、下載速度慢問(wèn)題解決辦法
這篇文章主要介紹了Android SDK Manager更新、下載速度慢問(wèn)題解決辦法的相關(guān)資料,需要的朋友可以參考下2017-05-05Android編程開(kāi)發(fā)中ListView的常見(jiàn)用法分析
這篇文章主要介紹了Android編程開(kāi)發(fā)中ListView的常見(jiàn)用法,較為詳細(xì)的分析了ListView的功能及常見(jiàn)使用方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10Android使用BottomNavigationBar實(shí)現(xiàn)導(dǎo)航欄功能
這篇文章主要介紹了Android使用BottomNavigationBar實(shí)現(xiàn)導(dǎo)航欄功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08Kotlin協(xié)程launch啟動(dòng)流程原理詳解
這篇文章主要為大家介紹了Kotlin協(xié)程launch啟動(dòng)流程原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12