关于android:targetSdkVersion

最近遇到一个问题,就是本来是彩色的图标,结果在5.x的设备商status bar上面notification icon的颜色是黑白的,而在4.x上面是彩色的。

在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。

正好研究了下targetSdkVersion生效的机制。对于这个例子而言,可以参看BaseStatusBar的实现代码:

if (entry.targetSdk >= Build.VERSION_CODES.LOLLIPOP) {
    entry.icon.setColorFilter(mContext.getResources().getColor(android.R.color.white));
} else {
    entry.icon.setColorFilter(null);
}

他会根据entry.targetSdk判断是否使用黑白模式。

这里的targetSdk就是在android:targetSdkVersion。如果看这段代码的调用关系,就会发现entry.targetSdk的值是通过:

ApplicationInfo info = pmUser.getApplicationInfo(sbn.getPackageName(), 0);
entry.targetSdk = info.targetSdkVersion;

赋值的,即ApplicaitonInfo.targetSdkVersion。

所以如果是在5.x的系统(sdk version是21/22)上运行应用,如果指定了targetsdkversion为21/22,那就会生效黑白模式;如果指定了targetSdkVersion为20或更低的值,则这段新的原色过滤的逻辑不生效,还是使用原有系统的行为。于是如果我们想在新的系统上仍然让应用保持旧系统的行文,就可以通过设置该属性为旧api版本来实现。

如果设置了targetSdkVersion为21,但运行在旧的4.x系统上(例如api 19),那因为实际的sdk runtime根本没有处理这么高targetSdkVersion的代码,所以自然也不会生效。而且sdk的代码一般采用>=某个版本号的方式来判断,所以保证了写21和写19的效果在19的机器上是完全一样的。

时间: 2024-10-05 10:22:19

关于android:targetSdkVersion的相关文章

关于android:targetSdkVersion所导致的问题

最近两天一直在纠结个问题,就是我们新版的软件通过IDEA编译出来运行在4.4的手机上 整个相机UI是完全错乱的,同事几个手机运行都一样,错乱的样子就是整个UI压缩挤压在一起, 完全不是你在布局里面设置的还具有相对位置的样子. 但是通过IDEA的布局文件的design按钮看到 的布局展示demo又是正常的,所以,一直怀疑是编译的问题,或者某些控件的id是否有重复. 于是重新rebuild,重新删除out,gen目录,重新编译,问题依旧. 晕哦,怎么回事?于是,我想仔细去分析下. 于是随意又用mei

Android targetSdkVersion 17 @JavascriptInterface

targetSdkVersion 是设置希望的SDK版本,如果设置了此属性,那么在程序执行时,如果目标设备的API版本正好等于此数值,他会告诉Android平台:此程序在此版本已经经过充分测,没有问题.不必为此程序开启兼容性检查判断的工作了.也就是说,如果targetSdkVersion与目标设备的API版本相同时,运行效率可能会高一些. 但是,这个设置仅仅是一个声明.一个通知,不会有太实质的作用,比如说,使用了targetSdkVersion这个SDK版本中的一个特性,但是这个特性在低版本中是

【移动开发】android:targetSdkVersion

android:targetSdkVersion An integer designating the API Level that the application targets. If not set, the default value equals that given to minSdkVersion. This attribute informs the system that you have tested against the target version and the sy

android:targetSdkVersion更新引发的“惨案”

一.前言 targetSdkVersion所暗示的许多行为变化都记录在VERSION_CODES文档中了,例如,Android6.0变化文档中谈了target为API23时会如何把你的应用转换到运行时权限模型上.由于某些行为的变化对用户是非常明显的,所以将target更新为最新的SDK是所有应用都应该优先处理的事情. 小编在新beta版本的测试中,开发更新了targetSdkVersion为23,沟通测试范围后,回归了权限相关的测试点,没想到的是,只是冰山一角,全功能回归中问题喷发,将小编深深埋

Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分

Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分 2014-01-23 13:14 10937人阅读 评论(16) 收藏 举报 分类: Android(22) 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 本文参考了谷歌开发者文档:http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#pro

【黑马Android】(06)使用HttpClient方式请求网络/网易新闻案例

使用HttpClient方式请求网络 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"

【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

数据库的创建和sql语句增删改查 1. 加载驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, name varchar(20), age integer ); 添加: insert into person(name, age) values('lisi', 19); 删除: delete from person where _id = 1; 修改: update person set name =

【Android】Sqlite数据库增删改查

Android系统内置一个Sqlite数据库,如果app需要使用Sqlite数据库数据库存储数据,Android会为此app生成一个.db文件.这个数据库在data/data/<package_name>/databases里面,其中<package_name>为该安卓app的工程包名,这个目录必须root后才能看到.在Windows,单机的应用程序,存储数据,基本放到一个文件里面,正如游戏的存档,基本就是把当前的游戏状态存到一个用户很难找到的文件里面.每次存档读档就是一个从这个存

Android SQLite数据库使用示例

简单介绍一下,现在的主流移动设备像Android.iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧.对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取. 下面我们用SQLite来开发一个英语词典.下图是项目结构-- MySQLite.java package sn.qdj.sqlitedemo; im