Android基础是什么,Android基础概念
android {
compileSdkVersion 23
buildToolsVersion “23.0.1”
defaultConfig {
applicationId “com.example.checkyourtargetsdk"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName “1.0”
}
以上是Android工程里名称为app的module的build.gradle文件其中的内容,涉及到的概念如下
minSdkVersion
我们的app能够运行的最小版本,如果选择15,那么就是Android 4.0.3 以及以上的设备才能运行我们app,如果小于这个版本,那么抱歉运行不了,我们不支持。这是应用程序支持api的下限。这也是应用商店判断这个应用是否能运行在设备上的一个依据之一。
compileSdkVersion
一句话总结,是编译环境下的SDK版本
例如指定的是23,编译环境使用的API就是6.0版本,注意改变编译版本号,本质上改变不了我们程序的运行,虽然可能会报错误❌或者警告⚠️,但compileSdkVersion 只会在编译期间起作用,因为环境是compileSdkVersion这个版本的SDK,所以你可以用一些这个版本的API,但是只是IDE给你的便利性帮助而已,帮助你检测代码,避免使用一些弃用的API。就算你用个低版本的compileSdkVersion,你依然可以那么写,但是可能会报错,报警告,但是你强制打包,其实也是没有问题的。IDE只是个工具,他的环境也只是工具的环境,不代表你应用运行时的表现。所以建议有两个可供选择。
指定compileSdkVersion为最新的,这样我们可以使用到最新SDK的API方法和机制。
compileSdkVersion与targetSdkVersion保持一致.
另外注意如果我们使用了比如V4,V7包,有没有发现必须和compileSdkVersion的版本相匹配,比如我们compileSdkVersion = 26,那么V4,v7的版本也要相应的是26.xx.xx,首位的26必须一致,后两位没有要求,就是说明编译所依赖的SDK和依赖包必须是统一版本,不然两个不兼容,编译会通不过。同时也是为了使用该版本的新特性。
targetSdkVersion
简单的说就是你的应用已经针对这个版本的手机,做了充分的兼容性处理和测试性处理,比如 if(Build.VERSION.SDK_INT >= 23) { ... } ,这样针对不同的SDK版本做不同的处理,这就说明我们不能随便的改变targetSdkVersion得值,我们必须做好充足的兼容性处理和测试处理才行。
在 Android 4.4 (API 19)以后,AlarmManager 的 set() 和 setRepeat() 这两个 API 的行为发生了变化。在 Android 4.4 以前,这两个 API 设置的都是精确的时间,系统能保证在 API 设置的时间点上唤醒 Alarm。因为省电原因 Android 4.4 系统实现了 AlarmManager 的对齐唤醒,这两个 API 设置唤醒的时间,系统都对待成不精确的时间,系统只能保证在你设置的时间点之后某个时间唤醒。虽然api的名字没有改变,但是功能结果已经发生改变,我们设置targetSdkVersion为16,Android4.4之前,那么我们在Android4.4之后运行会出现什么呢?难道就不能用了吗?不准确了吗?
当然不是,系统通过targetSdkVersion来保证Android的向前兼容性,在Android4.4之后的设备上,系统会判断你的targetSdkVersion是否小于19,如果小于的话,那就按照19之前的api方法,如果大于等于19,那么就按照之后的api方法来走,保证了程序运行的一致性。也就是向前兼容性。
但是还有一个问题:
Android 6.0新增加了动态权限申请,我们的targetSdkVersion是5.0,如果我们运行在Android 6.0的设备上怎么办?
因为我们这个可以向前兼容,向后不行啊,如果你的代码里处理了Android 6.0的动态权限处理,那么可以的,如果没呢?你想啥呢大哥?更新应用处理呗~~
targetSdkVersion 的大部分更新变化都会记录在VERSION_CODES,所有的细节也会在每个版本的平台亮点写明。
targetSdkVersion保证的是api的一致性。
所以一般minSdkVersion
不随意更改targetSdkVersion,更改targetSdkVersion必须做好兼容。
总结
一般设置为minSdkVersion
相关文章:

HDOJ 1060 Leftmost Digit
Author Ignatius.L题目大意:1.第一行输入一个整数T代表接下来有T组测试数据。2.接下来的T行,每行输入一个整数(1<N<1,000,000,000)。3.输出结果为N^N(N的N次方)最左边的那一位数(即最高位…

WPF-002 下拉列表的简单实现
最近在一个WPF项目中用到一个下拉列表,随着用户输入字符而进行显示,使用了绑定等知识,虽然实现比较简单,可是在性能上也是想了很多办法终于才勉强可以用,与大家分享下。 用于页面绑定的模型类: public clas…

洛谷:P3950 部落冲突
原题地址:https://www.luogu.org/problemnew/show/P3950 题目简述 给定一棵树,每次给定一个操作,有如下两种: 将某条边染黑 2.询问给定的u,v两点间是否有边被染黑思路 询问两点间是否有边被染黑只需要在求LCA时判一下就行。所以直接上树链剖分…

深入理解ceph-disk prepare 源码逻辑
文章目录CEPH-DISK代码逻辑DEF MAIN:DEF PARSE_ARGS:DEF Prepare.set_subparser(subparsers)def _prepare(self):PrepareBluestore的_prepare函数def prepare(self, *to_prepare_list):PrepareData类中的prepare函数def prepare_device(self, *to_prepare_list): #prepare_devi…

Deep Learning 学习随记(三)续 Softmax regression练习
上一篇讲的Softmax regression,当时时间不够,没把练习做完。这几天学车有点累,又特别想动动手自己写写matlab代码 所以等到了现在,这篇文章就当做上一篇的续吧。 回顾: 上一篇最后给出了softmax regression的代价函数和…

html画三个重叠的矩形,html5 实现两个矩形的叠加
Canvas Primer - Example: Drawing shadowswindow.addEventListener(load, function () {//得到canvas,并检测是否支持canvasvar elem document.getElementById(myCanvas);if (!elem || !elem.getContext) {return;}// 得到可以画图的上下文contextvar context el…

sqlplusw下登录sys账户
今天使用sqlplusw时,发现每次使用sys用户登录时总是报错,提示要以sysdba或者sysoper的身份登录,错误提示如下图所示:可是界面上没地方可以输入角色的地方呀,后经尝试发现,在口令输入框里首先输入密码&#…

mybatis =或这个=提示错误Tag name expecte问题解决
解决方案: 1、将<号或者>号进行转义 DATE_SUB(CURDATE(), INTERVAL 31 DAY) < DATE(created) 2、使用<![CDATA[ ]]>符号进行说明 <![CDATA[DATE_SUB(CURDATE(), INTERVAL 31 DAY) < DATE(created)]]> 附: 附录:常见…

s-sgdisk源码分析 “--set-alignment=value分区对齐参数”
文章目录边界对齐子命令使用源码分析sgdisk.cc main函数入口gptcl.cc DoOptions解析并执行具体命令函数gpt.cc CreatePartition创建分区函数,设置起始扇区对齐gpt.cc Align分区对齐函数,设置起始扇区对齐sgdisk命令是由 gdisk-0.8.6-4.el7.x86_64程序包安…

NuGet学习笔记(3) 搭建属于自己的NuGet服务器
文章导读 创建NuGetServer Web站点 发布站点到IIS 添加本地站点到包包数据源 在上一篇NuGet学习笔记(2) 使用图形化界面打包自己的类库 中讲解了如何打包自己的类库,接下来进行最重要的一步,从零开始搭建属于自己的NuGet服务器,诚然园子里及其…

计算机网络共享打不开,网络和共享中心打不开,共享无法访问没有权限
在Win7系统下如果别的计算机设置了共享,那么在本机设置网络发现后就可以打开网络搜索到共享计算机和共享文件了,不过一些朋友反馈win7系统网络发现无法启用的问题,下面小编整理了解决方法,大家可以参考一下哦。解决方法如下&#…
千万不要把 bool 当成函数参数
我们有很多 Coding Style 或 代码规范。 但这一条可能会经常被我们所遗忘,就是我们 经常会在函数的参数里使用bool参数,这会大大地降低代码的可读性。 不信?我们先来看看下面的代码。 当你读到下面的代码,你会觉得这个代码是什么意…

修改ceph-disk源码,增加指定ceph.conf部署osd的功能
文章目录 ceph环境源码修改 主文件:`ceph-disk/main.py`main函数入口parse_args(argv)增加子命令解析get_conf函数使`conf`生效修改所有调用get_conf函数的上级函数参数配置由于最近工作中需要优化osd部署流程,单节点并发加盘过程需要指定特定conf文件,来完成单盘db,wal分区…

相关计算机专业的英语文献,英文文献及翻译计算机专业.doc
英文文献及翻译计算机专业外文资料翻译—英文原文NET-BASED TASK MANAGEMENT SYSTEMHector Garcia-Molina, Jeffrey D. Ullman, Jennifer WisdomABSTRACTIn net-based collaborative design environment, design resources become more and more varied and complex. Besides c…

作业 3 应用分支与循环结构解决问题 统计字符个数
/*统计字符,包括空格或回车,数字字符和其他字符*/#include<stdio.h> int main(void) {int digit,space,letter,other; /*定义4个变量分别存放统计结果*/ char ch;int i;digitspaceletterother0; /*置…

php后期静态绑定
从php5.3开始,php增加了一个叫后期绑定的功能,用于在继承范围内引用静态调用的类 该功能从语言内部角度考虑北命名为“后期静态绑定”;“后期绑定”意思说:static::不再被解析为定义当前方法所在的类&#…

pytest 9 pytest-datadir读取文件信息
安装:pip install pytest-datadir 介绍:用于操作测试数据目录和文件的插件。pytest-datadir他会寻找包含测试模块名字的文件夹或者全局的一个文件夹名字为data下的数据。比如以下的一个结构: firstdemo.py可以从test_firstdemo文件夹下的文件…

深入理解ceph-disk activate 源码逻辑
文章目录CEPH-DISK代码逻辑Activate osd的主要逻辑如下DEF main_activate激活osd的入口函数DEF mount_activate挂载临时目录,分配osd id并初始化osdDEF activate 分配osd_id以及初始化osdCEPH-DISK代码逻辑 本文在上文 :深入理解ceph-disk prepare 源码逻辑基础上描…

simple_html_dom meta,HTML DOM Meta content 属性
HTML DOM Meta content 属性Meta 对象定义和用法content 属性可设置或者返回 meta 元素 content 属性值。content 属性指定了 meta 信息的内容。注意: 这个属性可用的值依赖于name 和httpEquiv 属性的值。语法设置 content 属性:linkObject.content"…

struts2登录后返回登录前的页面
在Action中添加 String getUrl() { return ServletActionContext.getRequest().getHeader("referer"); } 然后配置struts的这个Action的result为:<result type"redirect">${url}</resu…

Exchange 2010 恢复误删除的邮箱账户及其邮箱
在误删除邮箱后,AD中相应的账号也会随之删除,此时该如何恢复? 先来模拟邮箱被误删除,在EMC控制台中删除别名为jqq的邮箱 打开ADUC,发现相应的jqq账号也被删除了: 1.恢复AD账号 下载运行ADRecycle Bin,点击【…

Python 函数初识 (1)
一、今日主要内容 认识函数 函数:对功能或者动作的封装(定义) 语法: def 函数名字(形参) 函数体 函数的调用格式:函数名(实参) 函数的返回值 关键字:return 终止函数的运行 1、函数内部不写return,默认函数末尾返回…

python的popen函数
最近了解了一下python的popen函数的使用,主要是用来执行linux命令 函数使用 使用之前需要导入import os模块 使用方式: os.popen(cmd)返回值: 返回一个文件句柄 import os cmd"/sbin/partx /dev/sdb" result_listos.popen(cmd) print result_list执行…

计算机竞赛CCC可以直接学吗,CCC 计算机竞赛到底有多牛!
加拿大计算机竞赛是什么?难度情况?加拿大计算机竞赛是由加拿大滑铁卢大学主办的,每年举办一次,是一场面向中学生的计算机程序设计比赛,CCC竞赛的一个目的是为广大中学生朋友们提供一个机会来测试自己分析、设计以及编程…

PHP basename() 函数
定义和用法 basename() 函数返回路径中的文件名部分。 语法 basename(path,suffix) 参数描述path必需。规定要检查的路径。suffix可选。规定文件扩展名。如果文件有 suffix,则不会输出这个扩展名。转载于:https://www.cnblogs.com/wuyou/p/3387079.html

真实工作经验总结——案例解析企业选型操作步骤
这是一个融合了本人以前工作经验的案例,包含有多个企业的选型需求。选型的过程也参考了本人以前所经历的部分事实。展现的目的在于让PUBer看到一个相对真实的选型。企业介绍这是一家中型的电脑和周边设备生产企业,即一个典型的电子企业。企业有内贸和外贸…

Oracle Goldengate Windows平台Oracle-Oracle单向复制
实验目的 Goldengate最基本的从源端一对一的单向复制,注意其中Goldengate版本取决于Oracle的版本。单向复制一般适用于保持目标数据库的实时更新,且目标数据库用来检索,如报表或者分析使用。 Source DB 操作系统:Windows 10 64 Or…

C语言解析命令行函数:getopt系列
头文件:/usr/include/getopt.h 函数传入较长参数 函数getopt_long_only和getopt_long两者用法差不多,都可以用来解析命令行选项 函数出处 #include <getopt.h> //getopt_long()头文件位置 int getopt_long (int ___argc, char *const *___ar…

宁波大学计算机专业复试,2016年宁波大学信息科学与工程学院计算机专业考研复试题库. (1)...
2016年宁波大学信息科学与工程学院计算机专业考研复试题库(二)——————————————————————————————————————————一、选择题1.下列有关浮点数加减运算的叒述中,正确的是()。对阶操作丌会引起阶码上溢戒下溢右规和尾…

RedHat、CentOS设置静态IP、主机名、关闭防火墙(虚拟机VMware客户机)
设置静态IP、主机名 1. /etc/sysconfig/network [roothadoop ~]# vi /etc/sysconfig/network NETWORKINGyes HOSTNAMEhadoop #主机名 GATEWAY192.168.80.1 #网关 2. /etc/sysconfig/network-scripts/ifcfg-eth0 [roothadoop ~]# vi /etc/sysconfig/network-scripts/ifc…