日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
上次發(fā)版我就改了一行代碼!

動態(tài)更換應(yīng)用Icon

產(chǎn)品:我們可以動態(tài)更換App在Launcher里面的Icon嗎

開發(fā):不可以

產(chǎn)品:我們可以動態(tài)更換App在Launcher里面的Icon嗎

開發(fā):不可以

產(chǎn)品:我們可以動態(tài)更換App在Launcher里面的Icon嗎

開發(fā):不可以

產(chǎn)品:我們可以動態(tài)更換App在Launcher里面的Icon嗎

開發(fā):讓我想想……

原理1——activity-alias

在AndroidMainifest中,有兩個屬性:

 
 
 
 
  1. // 決定應(yīng)用程序***啟動的Activity 
  2.  
  3. android.intent.action.MAIN 
  4.  
  5. // 決定應(yīng)用程序是否顯示在程序列表里 
  6.  
  7. android.intent.category.LAUNCHER  

另外,還有一個activity-alias屬性,這個屬性可以用于創(chuàng)建多個不同的入口,相信做過系統(tǒng)Setting和Launcher開發(fā)的開發(fā)者在系統(tǒng)的源碼中應(yīng)該見過很多。

原理2——PM.setComponentEnabledSetting

PackageManager是一個大統(tǒng)領(lǐng)類,可以管理所有的系統(tǒng)組件,當(dāng)然,如果Root了,你還可以管理其它App的所有組件,一些系統(tǒng)優(yōu)化工具就是通過這個方式來禁用一些后臺Service的。

使用方式異常簡單:

 
 
 
 
  1. private void enableComponent(ComponentName componentName) { 
  2.  
  3.     mPm.setComponentEnabledSetting(componentName, 
  4.  
  5.             PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
  6.  
  7.             PackageManager.DONT_KILL_APP); 
  8.  
  9.  
  10.   
  11.  
  12. private void disableComponent(ComponentName componentName) { 
  13.  
  14.     mPm.setComponentEnabledSetting(componentName, 
  15.  
  16.             PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
  17.  
  18.             PackageManager.DONT_KILL_APP); 
  19.  
  20. }  

根據(jù)PackageManager.COMPONENT_ENABLED_STATE_ENABLED和PackageManager.COMPONENT_ENABLED_STATE_DISABLED這兩個標(biāo)志量和對應(yīng)的ComponentName,就可以控制一個組件的是否啟用。

動態(tài)換Icon

有了上面的兩個原理,來實現(xiàn)動態(tài)更換Icon就只剩下思路問題了。

首先,我們創(chuàng)建一個Activity,作為默認(rèn)的入口并帶著默認(rèn)的圖片,再創(chuàng)建一個雙11的activity-alias,指向默認(rèn)的Activity并帶有雙11的圖片,再創(chuàng)建一個雙12的activity-alias,指向默認(rèn)的Activity并帶有雙12的圖片……等等等。

 
 
 
 
  1.  
  2.  
  3.      
  4.  
  5.          
  6.  
  7.   
  8.  
  9.          
  10.  
  11.      
  12.  
  13.  
  14.  
  15.   
  16.  
  17.  
  18.     android:name=".Test11" 
  19.  
  20.     android:enabled="false" 
  21.  
  22.     android:icon="@drawable/s11" 
  23.  
  24.     android:label="雙11" 
  25.  
  26.     android:targetActivity=".MainActivity"> 
  27.  
  28.      
  29.  
  30.          
  31.  
  32.   
  33.  
  34.          
  35.  
  36.      
  37.  
  38.  
  39.  
  40.   
  41.  
  42.  
  43.     android:name=".Test12" 
  44.  
  45.     android:enabled="false" 
  46.  
  47.     android:icon="@drawable/s12" 
  48.  
  49.     android:label="雙12" 
  50.  
  51.     android:targetActivity=".MainActivity"> 
  52.  
  53.      
  54.  
  55.          
  56.  
  57.   
  58.  
  59.          
  60.  
  61.      
  62.  
  63.   

等等,這樣有個問題,那就是這樣會在Launcher上顯示3個入口,所以,默認(rèn)我們會把這些activity-alias先禁用,等到要用的時候再啟用,養(yǎng)兵千日,用兵一時。

 
 
 
 
  1. public class MainActivity extends AppCompatActivity { 
  2.  
  3.   
  4.  
  5.     private ComponentName mDefault; 
  6.  
  7.     private ComponentName mDouble11; 
  8.  
  9.     private ComponentName mDouble12; 
  10.  
  11.     private PackageManager mPm; 
  12.  
  13.   
  14.  
  15.     @Override 
  16.  
  17.     protected void onCreate(Bundle savedInstanceState) { 
  18.  
  19.         super.onCreate(savedInstanceState); 
  20.  
  21.         setContentView(R.layout.activity_main); 
  22.  
  23.         mDefault = getComponentName(); 
  24.  
  25.         mDouble11 = new ComponentName( 
  26.  
  27.                 getBaseContext(), 
  28.  
  29.                 "com.xys.changeicon.Test11"); 
  30.  
  31.         mDouble12 = new ComponentName( 
  32.  
  33.                 getBaseContext(), 
  34.  
  35.                 "com.xys.changeicon.Test12"); 
  36.  
  37.         mPm = getApplicationContext().getPackageManager(); 
  38.  
  39.     } 
  40.  
  41.   
  42.  
  43.     public void changeIcon11(View view) { 
  44.  
  45.         disableComponent(mDefault); 
  46.  
  47.         disableComponent(mDouble12); 
  48.  
  49.         enableComponent(mDouble11); 
  50.  
  51.     } 
  52.  
  53.   
  54.  
  55.     public void changeIcon12(View view) { 
  56.  
  57.         disableComponent(mDefault); 
  58.  
  59.         disableComponent(mDouble11); 
  60.  
  61.         enableComponent(mDouble12); 
  62.  
  63.     } 
  64.  
  65.   
  66.  
  67.     private void enableComponent(ComponentName componentName) { 
  68.  
  69.         mPm.setComponentEnabledSetting(componentName, 
  70.  
  71.                 PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
  72.  
  73.                 PackageManager.DONT_KILL_APP); 
  74.  
  75.     } 
  76.  
  77.   
  78.  
  79.     private void disableComponent(ComponentName componentName) { 
  80.  
  81.         mPm.setComponentEnabledSetting(componentName, 
  82.  
  83.                 PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
  84.  
  85.                 PackageManager.DONT_KILL_APP); 
  86.  
  87.     } 
  88.  
  89. }  

OK了,禁用默認(rèn)的Activity后,啟用雙11的activity-alias,結(jié)果不變還是指向了默認(rèn)的Activity,但圖標(biāo)已經(jīng)發(fā)生了改變。

根據(jù)ROM的不同,在禁用了組件之后,會等一會,Launcher會自動刷新圖標(biāo)。

效果參考下圖。

專欄作者簡介

eclipse_xu:Android 高級開發(fā)工程師;《Android群英傳》、《Android群英傳:神兵利器》作者、慕課網(wǎng)Android講師;CSDN博客專家


本文標(biāo)題:上次發(fā)版我就改了一行代碼!
網(wǎng)頁URL:http://www.5511xx.com/article/coicedh.html