自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

上次發(fā)版我就改了一行代碼!

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

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

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

開發(fā):不可以

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

開發(fā):不可以

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

開發(fā):不可以

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

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

原理1——activity-alias

在AndroidMainifest中,有兩個屬性:

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

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

原理2——PM.setComponentEnabledSetting

PackageManager是一個大統(tǒng)領類,可以管理所有的系統(tǒ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這兩個標志量和對應的ComponentName,就可以控制一個組件的是否啟用。

動態(tài)換Icon

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

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

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

等等,這樣有個問題,那就是這樣會在Launcher上顯示3個入口,所以,默認我們會把這些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了,禁用默認的Activity后,啟用雙11的activity-alias,結果不變還是指向了默認的Activity,但圖標已經(jīng)發(fā)生了改變。

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

效果參考下圖。 

 

 

[[180569]] 

專欄作者簡介

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

責任編輯:龐桂玉 來源: 安卓開發(fā)精選
相關推薦

2016-12-02 08:53:18

Python一行代碼

2024-12-03 09:23:20

2014-02-12 13:43:50

代碼并行任務

2022-04-09 09:11:33

Python

2017-04-05 11:10:23

Javascript代碼前端

2020-04-10 15:20:40

數(shù)據(jù)庫SQL索引

2022-04-11 11:38:44

Python代碼游戲

2021-11-02 16:25:41

Python代碼技巧

2020-08-19 10:30:25

代碼Python多線程

2020-09-09 16:00:22

Linux進程

2021-08-31 09:49:37

CPU執(zhí)行語言

2017-04-13 19:20:18

Python代碼并行任務

2023-09-12 10:10:57

開發(fā)者工具開源

2020-09-28 12:34:38

Python代碼開發(fā)

2019-12-25 14:08:50

Pandas數(shù)據(jù)計算

2020-08-12 14:54:00

Python代碼開發(fā)

2020-08-03 09:05:48

代碼程序員案例

2022-09-28 10:12:50

Python代碼可視化

2021-12-26 12:10:21

React組件前端

2021-05-28 07:39:17

SQL代碼操作
點贊
收藏

51CTO技術棧公眾號