关于android:targetSdkVersion

最近遇到一个问题,就是原本是彩色的图标,结果在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

相关文章
相关标签/搜索