版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
【移動應用開發(fā)技術(shù)】Android動態(tài)修改應用圖標與名稱的方法實例
遇到的坑
這里我把做這個功能中遇到的一些問題寫在前面,是為了大家能先了解有什么問題存在,遇到這些問題的時候就不慌了,這里我把應用圖標和名稱先統(tǒng)一使用icon代替進行說明。
1、動態(tài)替換icon,只能替換內(nèi)置的icon,無法從服務器端獲取來更新icon;
2、動態(tài)替換icon以后,應用內(nèi)更新的時候必須要切換到原始icon),否則可能導致更新安裝失敗(AS上表現(xiàn)為adb運行會失敗),或者升級后應用圖標出現(xiàn)多個甚至應用圖標都不顯示的情況(這些問題都可以通過下面我推薦的開發(fā)規(guī)則解決掉,所以這是一個坑點,不是肯定會發(fā)生的問題,只不過大多數(shù)人會遇到。);
3、Android系統(tǒng)動態(tài)替換appicon會有延遲,在不同的手機系統(tǒng)上刷新icon的時間不一樣,大概在10秒左右,在這個時間內(nèi)點擊icon會提示應用未安裝(提示可能會有差別,目前我的小米就不會提示任何信息,點了沒有反應);
4、更換icon的代碼運行后一會應用就閃退了,或者導致顯示中的Dialog和PopupWindow報錯崩潰(這個問題和第二個問題有很大的相關性,按我下面給出的規(guī)則實行的話是可以解決的。
多入口配置
多入口配置,字面意思就是應用程序的多個入口配置,在AndroidManifest.xml中有一個叫activity-alias的標簽,這個標簽從字面上看就能理解是activity別名的意思,這里我給出一個示例作下相應的說明。
activity-alias例子說明:
顯示多個啟動入口
然后這里我先做一個多個啟動入口全部顯示的app示例,這里需要寫的代碼都在清單文件中,代碼如下:
運行后的效果如下:可以看到桌面上顯示了三個圖標,進入的都是MainActivity這個頁面,圖標我用的自動生成的,就懶的去找圖標了,效果上能看出來就行。
當然了,實際項目中我們只會顯示一個圖標,這里我們只需要把"別名1"和"別名2"的android:enabled="true"改為"false"就行了,這樣就只顯示一個圖標了,就不放效果圖了。
代碼控制切換不同的應用圖標顯示
馬上春節(jié)了,我們產(chǎn)品說到哪個時間點我們的應用圖標就要換成春節(jié)用的圖標了,當然,前面說了這些圖標要先在應用寫好,不是通過服務器動態(tài)拿的,而是應用內(nèi)已經(jīng)寫好的。那這個時候我們就需要通過代碼進行應用圖標的動態(tài)切換了,這里我給出Demo里面布局如圖:這里三個按鈕點擊后切換到相應的應用圖標和名稱,"原ACTIVITY"代表只顯示MainActivity這個原來的啟動入口,"ALIAS_1"代表別名1,以此類推。
這三個按鈕點擊對應的代碼如下:
?。?!這里要注意一個點,就是ComponentName里面的路徑一定要寫全了,如果在報錯日志看到類似找不到這個路徑的日志的話,那十有八九就是這個問題了。
切換的代碼其實很少,大家看了基本上也都明白了,這里就不做過多解釋了。這里我基于隱藏所以別名的情況下,也就是只顯示原來的一個APP圖標的情況,點一下"ALIAS_1"這個按鈕,也就是將圖標切換到"別名1",最終效果如下:可以看到只顯示這一個入口了,但是如果大家在點了"ALIAS_1"之后,馬上就返回到主頁看盯著這個app的圖標,我們會發(fā)現(xiàn)在它在大概10s內(nèi)是沒有變化的,在大概10s后才更新成我們切換的那個圖標,還有,在它沒更新成功的時候如果我們點這個原來的圖標,一般會吐司一條“未安裝”之類的信息(華為是未安裝),這里我的小米是點了沒有反應,要等大概10s秒后更新成功了才能點這個圖標進入應用。所以,通過代碼我們"已經(jīng)做到了"圖標的切換,但是!??!
那是不是這樣就完了呢??顯然不是的,問題還挺多的,我一一道來。
不知道大家在點了切換的按鈕后有沒有一直停在app里面,沒有的話我們嘗試點完后在app里面不要回到桌面,如果停在app里面的話,我們會在大概10s,也就是更新成功的時候,應用就會發(fā)生閃退了,也就是坑4這個問題。這個問題我做了很多測試,總結(jié)了一下原因和規(guī)避的方法,原因是我們在代碼里面設置了我們原來的真實的那個MainActiviy的enable為false,代碼如下:
只要代碼設置了真實的那個Activity的enable為false,也就是代碼對應的PackageManager.COMPONENT_ENABLED_STATE_DISABLED,那就會導致我們的應用閃退,那是不是我們不設置這個就好了呢?那我們不設置這個的話怎么隱藏真實的MainActivity的圖標呢?這個解決方法后面我會提出來。
但是,你以為只有這個問題嗎?其實還有坑,只是這個坑不容易發(fā)現(xiàn),這個時候我們回到我們當前的情況,也就是當前我們已經(jīng)切換到"別名1"了,桌面上也只有這個圖標了,我們也能點擊這個圖標正常使用我們的應用,這些都沒有問題,我們以為都是正常的了。但是,這個時候,如果我們通過adb,使用AndroidStudio運行項目的時候,會提示launchapp失敗,失敗的信息如下:
01/1016:48:54:Launchingapp
$adbshellamstart-n"com.wepon.switchicondemo/com.wepon.switchicondemo.MainActivity"-aent.action.MAIN-cent.category.LAUNCHER
Errorwhileexecuting:amstart-n"com.wepon.switchicondemo/com.wepon.switchicondemo.MainActivity"-aent.action.MAIN-cent.category.LAUNCHER
Starting:Intent{act=ent.action.MAINcat=[ent.category.LAUNCHER]cmp=com.wepon.switchicondemo/.MainActivity}
Errortype3
Error:Activityclass{com.wepon.switchicondemo/com.wepon.switchicondemo.MainActivity}doesnotexist.
ErrorwhileLaunchingactivity
01/1016:48:54:Launchingapp
$adbshellamstart-n"com.wepon.switchicondemo/com.wepon.switchicondemo.MainActivity"-aent.action.MAIN-cent.category.LAUNCHER
Errorwhileexecuting:amstart-n"com.wepon.switchicondemo/com.wepon.switchicondemo.MainActivity"-aent.action.MAIN-cent.category.LAUNCHER
Starting:Intent{act=ent.action.MAINcat=[ent.category.LAUNCHER]cmp=com.wepon.switchicondemo/.MainActivity}
Errortype3
Error:Activityclass{com.wepon.switchicondemo/com.wepon.switchicondemo.MainActivity}doesnotexist.ErrorwhileLaunchingactivity
同樣導致的問題還有一個,就是我們代碼動態(tài)切換了app圖標之后,應用升級,也就是更新應用的時候,會導致安裝失敗,或者是安裝完成后出現(xiàn)多個圖標甚至是沒有圖標出現(xiàn)在桌面上了??!這些問題是要遇到運行,或者升級包的時候才會發(fā)現(xiàn)的,但是那時候發(fā)現(xiàn)就晚了,所以這是一個比較大的坑,這里對應的坑就是我在前面提到的坑2這個點。
這里還有一種情況也會導致坑2的發(fā)生,例如,我們Demo現(xiàn)在是一個MainActivity和兩個別名,如果我們在下一個版本把這兩個別名刪除了,或者刪除了我們當前安裝包正在顯示的別名,那么安裝的新版本可能就不會有應用圖標顯示了,那就會導致我們應用安裝成功了,但是卻沒有入口!
類似的問題還有一些,主要都是在應用升級后發(fā)生,而且不管是導致安裝失敗、安裝后沒有圖標或者安裝后產(chǎn)生多個圖標,這些現(xiàn)象都是非常嚴重的,但是這些問題我們都是可以避免的,這里我總結(jié)了一些規(guī)則,按這些規(guī)則進行操作的話是不會產(chǎn)生以上這些問題的,當然,如果還有其他問題的話歡迎交流,因為我們的app也在做這個功能。
動態(tài)修改圖標的開發(fā)規(guī)則,防坑專用
1、Activity的android:enabled屬性,一定不要在代碼里面去設置enabled這個值,否則會在切換圖標的過程導致應用閃退,目前測試了小米、華為和官方模擬器都有在這個問題。
2、清單文件中設置Activity的android:enabled="false”,這個在之后的版本就固定這個值,如果設置為true了,則有可能在應用升級后出現(xiàn)多個圖標;
3、然后為我們的應用設置一個默認的Activity-alias用來顯示圖標(也是唯一一個顯示的,一般我們也只需要顯示一個圖標),也是用來代替第一點設置Activity的android:enabled="false”可能導致的桌面上沒有應用圖標的問題;
4、Activity-alias的android:enabled="true"的默認顯示的項盡可能不要中途進行變動,如果確實需要使用新的默認值,則使用代碼進行動態(tài)變換;
5、Activity-alias的android:enabled="true"的不要設置為多個,否則會出現(xiàn)多個圖標,如果試圖通過代碼進行隱藏其中的一個或者幾個,可能會出現(xiàn)圖標消失的情況,這個第2點已經(jīng)有提過了;
6、后面新的版本如果要加新的Activity-alias,那么都要設置android:enabled=“false”,這個清單文件中的值要設置成false,然后再通過代碼動態(tài)變換;
7、后面新的版本的Activity-alias必須包含上一個版本的所有Activity-alias,主要是防止覆蓋安裝后應用圖標消失的情況;
以上就是我在做這個功能的過程中總結(jié)出來的規(guī)則,目前沒有發(fā)現(xiàn)在其它的問題,有別的問題的朋友歡迎留言討論,還有,按照這些規(guī)則做的話,覆蓋安裝后的應用圖標也會是你上一次通過代碼動態(tài)修改成功的圖標,因為手機的Launcher會有記錄,也就是我們通過代碼會修改這個在Launcher中的記錄。
對了,我們在清單文件中配置的Activity和Activity-alias的icon和label信息在新的版本中都是可以換的,這些跟代碼無關了,也就是跟我們平常換下app圖標名稱是一樣的操作,希望大家不要誤解了這里-_-!!!。
最后
最后,可能有的同學會
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2021年超市促銷方案5篇范文模板
- 石河子大學《食品物性學》2022-2023學年第一學期期末試卷
- 石河子大學《結(jié)構(gòu)力學二》2023-2024學年第一學期期末試卷
- 石河子大學《簡明新疆地方史教程》2022-2023學年第一學期期末試卷
- 石河子大學《風景畫表現(xiàn)》2021-2022學年第一學期期末試卷
- 沈陽理工大學《自動武器原理與構(gòu)造》2023-2024學年第一學期期末試卷
- 沈陽理工大學《交互設計》2023-2024學年第一學期期末試卷
- 2018年四川內(nèi)江中考滿分作文《我心中的英雄》12
- 沈陽理工大學《電力電子技術(shù)》2023-2024學年期末試卷
- 廣州 存量房交易合同 范例
- MOOC 3D工程圖學-華中科技大學 中國大學慕課答案
- 提高出院病案7天回收率PDCA持續(xù)改進方案
- 爭戰(zhàn)得勝之方江秀琴
- 淺析初中數(shù)學學科特點與思想方法
- 施工方案及施工三措
- 生涯彩虹圖(含分析)
- 港口理貨業(yè)務PPT課件
- 村廉政風險點及防控措施一覽表檔
- 生管SWOT分析
- (完整版)離子共存問題習題及參考答案(最新(精華版)
- 門座式起重機檢驗規(guī)程
評論
0/150
提交評論