最近遇到一個問題,就是原本是彩色的圖標,結果在5.x的設備商status bar上面notification icon的顏色是黑白的,而在4.x上面是彩色的。java
在SO上面找到這篇文章,http://stackoverflow.com/questions/28387602/notification-bar-icon-turns-white-in-android-5-lollipop。大意就是這個是5.x(api 21)的新行爲,若是AndroidManfifext.XML中的android:targetSdkVersion設置爲21,那麼在5.x的系統上,就是這種行爲。若是必定要顯示彩色,像4.x那樣,就設置android:targetSdkVersion爲老的api號,例如20。android
正好研究了下targetSdkVersion生效的機制。對於這個例子而言,能夠參看BaseStatusBar的實現代碼:api
if (entry.targetSdk >= Build.VERSION_CODES.LOLLIPOP) { entry.icon.setColorFilter(mContext.getResources().getColor(android.R.color.white)); } else { entry.icon.setColorFilter(null); }
他會根據entry.targetSdk判斷是否使用黑白模式。ui
這裏的targetSdk就是在android:targetSdkVersion。若是看這段代碼的調用關係,就會發現entry.targetSdk的值是經過:google
ApplicationInfo info = pmUser.getApplicationInfo(sbn.getPackageName(), 0);
entry.targetSdk = info.targetSdkVersion;
賦值的,即ApplicaitonInfo.targetSdkVersion。spa
因此若是是在5.x的系統(sdk version是21/22)上運行應用,若是指定了targetsdkversion爲21/22,那就會生效黑白模式;若是指定了targetSdkVersion爲20或更低的值,則這段新的原色過濾的邏輯不生效,仍是使用原有系統的行爲。因而若是咱們想在新的系統上仍然讓應用保持舊系統的行文,就能夠經過設置該屬性爲舊api版原本實現。code
若是設置了targetSdkVersion爲21,但運行在舊的4.x系統上(例如api 19),那由於實際的sdk runtime根本沒有處理這麼高targetSdkVersion的代碼,因此天然也不會生效。並且sdk的代碼通常採用>=某個版本號的方式來判斷,因此保證了寫21和寫19的效果在19的機器上是徹底同樣的。blog