minSdkVersion、targetSdkVersion、compileSdkVersion三者的作用解析

        minSDK和targetSDK,这两者相当于一个区间。你能够用到targetSDK中最新的API和最酷的新功能,但又需要向后(向下)兼容到minSDK,保证这个区间内的设备都能够正常的执行你的APP。换句话说,想使用Android刚刚推出的新特性,但这对于你的APP又不是必须的。此时就能够做如下处理:

  • targetSDK设置为想使用新特性的SDK版本号;
  • minSDK设置成低版本号保证全部人都能够使用此APP。

eg:假如你想给你的app增加大量的手势操作(sdk 7才引入的),然而这些手势操作能够被Button啊或menu等取代,在这样的情况下,手势操作就是一个额外的加分功能,而不是一个必须的功能,因此你就须要把targetSDK设置为7,把minSDK设置为3(这是举个样例,如今没人还在用这么老的设备了)这样即使是使用老设备的用户也能够用你的app了。

然后你所要做的就是要在代码里推断版本号,假设是大于等于7的版本号中就使用手势操作,小于7的版本号中就使用button等取代,这样使用了新手机的用户就能够体验到你app中酷炫的新功能了。

eg:假设你想给你的项目增加Android 5.0的Material Design,有一些用户可能会升级到5.0而使用到你的新特性,而有一部分用户的手机硬件太老,不支持升级到5.0。那么你就要为他们进行向后(向下)兼容,不至于损失这部分用户,至此APP的targetSDK设置为21。minSDK能够设置为8(不是固定非要这个值)

minSDKVersion
minSdkVersion限制安装application所需要的系统最低版本,低于该版本的系统都不可以安装该application。
同时不能使用该level版本SDK所不具备的API,
例如在minSdkVersion为8的application中调用【this.getActionBar()】
就会出现Call requires API level 11 (current min is 8): android.app.Activity#getActionBar的错误。
这是因为ActionBar是在Android 11才出现的新功能(new API)。
targetSDKVersion
targetSdkVersion是Android提供向前兼容的主要依据,
表明该application已经兼容从minSdkVersion至tartgetSdkVersion之间所有api的变化。
在targetSdkVersion更新之前系统不会应用最新的行为变化。
compileSDKVersion
targetSdkVersion是Android提供向前兼容的主要依据,
表明该application已经兼容从minSdkVersion至tartgetSdkVersion之间所有api的变化。
在targetSdkVersion更新之前系统不会应用最新的行为变化。
三者关系
minSdkVersion <= targetSdkVersion <= compileSdkVersion
理想情况
minSdkVersion (lowest possible) <=targetSdkVersion == compileSdkVersion (latest SDK)

理想情况下:用较低的 minSdkVersion 来覆盖最大的人群,用最新的 SDK 设置 target 和 compile 来获得最好的外观和行为。
Android主Module与依赖Module之间targetSDKVerion关系
Android项目以主Module的targetSDKVersion为准。也即是说,依赖Module targetSDKVersion的设置是无效的。
Android 高版本API方法在低版本系统上的兼容性处理
1.用@TargeApi($API_LEVEL) 使可以编译通过, 不建议使用@SuppressLint("NewApi");
区别:
@SuppressLint("NewApi")屏蔽一切新api中才能使用的方法报的android lint错误
@TargetApi() 只屏蔽某一新api中才能使用的方法报的android lint错误
举个例子,某个方法中使用了api9新加入的方法,而项目设置的android:minSdkVersion=8,此时在方法上加@SuppressLint("NewApi")
和@TargetApi(Build.VERSION_CODES.GINGERBREAD)都可以,以上是通用的情况。
而当你在此方法中又引用了一个api11才加入的方法时,@TargetApi(Build.VERSION_CODES.GINGERBREAD)注解的方法又报错了,而
@SuppressLint("NewApi")不会报错,这就是区别。
2.判断运行时版本,在低版本系统不调用此方法,同时为了保证功能的完整性,需要提供低版本功能实现
例如:
public class MainActivity extends AppCompatActivity {
   private  AlertDialog.Builder builder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //如果API level大于11 大于11的时候能够指定主体
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
             builder = new AlertDialog.Builder(this,
                    AlertDialog.THEME_HOLO_LIGHT);

        }else {
             builder = new AlertDialog.Builder(this);

        }
        builder.setItems(new String[] { "拍照","选择" },
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                });
        builder.setTitle("选择照片");
        builder.create().show();
    }
}

参考文献:

compileSdkVersion, minSdkVersion 和 targetSdkVersion详解

彻底明确怎样设置minSdkVersion和targetSdkVersion-CSDN博客

minSdkVersion、targetSdkVersion、compileSdkVersion三者的作用解析_android module targetsdkversion-CSDN博客

向原创致敬🫡

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/724240.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6 PXE高效批量网络装机

6.1部署PXE远程安装服务 在大规模的Liunx应用环境中&#xff0c;如web群集&#xff0c;分布式计算等&#xff0c;服务器往往并不配备光驱设备&#xff0c;在这种情况下&#xff0c;如何为数十乃至上百台服务器裸机快速安装系统呢&#xff1f;传统的USB光驱&#xff0c;移动硬盘…

零编程数据可视化展示:十个简易案例!

数据可视化是呈现数据内在价值的最终手段。数据可视化实例利用各种图表和图形设计手段&#xff0c;合乎逻辑地展示复杂而不直观的数据。为了让用户直观清楚地了解他们想要的数据及其比较关系&#xff0c;数据可视化实例的呈现至关重要。即时设计整理了10个数据可视化实例&#…

17-C语言中的变量生命周期——自动存储期、青苔存储期、自定义存储期

17-C语言中的变量生命周期——自动存储期、青苔存储期、自定义存储期 文章目录 17-C语言中的变量生命周期——自动存储期、青苔存储期、自定义存储期一、自动存储期示例 二、静态存储期2.1 示例 三、自定义存储期3.1 如何申请内存3.2 如何释放内存3.3 如何清空内存3.4 示例 概念…

【学习DayNa】信息系统开发整理

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 结构化方法 结构是指系统内各个组成要素之间的相互联系、相互作用的框架。结构化开发方法就是…

需求工程师的基本职责(合集)

需求工程师的基本职责1 职责&#xff1a; 1、负责用户需求调研、用户需求分析&#xff0c;明确用户需求分析&#xff0c;明确用户功能需求、业务需求&#xff0c;转换成软件需求说明。 2、收集、分析、整理、提炼系统需求&#xff0c;能够对业务流程提出优化建议并写成系统功能…

音视频入门基础:H.264专题(1)——H.264官方文档下载

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

SpringBoot整合Minio(支持公有及私有bucket)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; SpringBoot整合Minio(支持公有及私有bucket) ⏱️ 创作时间&#xff1…

第6章 设备驱动程序(4)

目录 6.5 块设备操作 6.5.5 请求结构 6.5.6 BIO 6.5.7 提交请求 6.5.8 I/O调度 6.5.9 ioctl实现 本专栏文章将有70篇左右&#xff0c;欢迎关注&#xff0c;查看后续文章。 6.5 块设备操作 6.5.5 请求结构 struct request { //放在请求队列上&#xff0…

Go Gin框架

一、Gin介绍 Gin是一个用Go编写的HTTPweb框架。它是一个类似于martini但拥有更好性能的API框架, 优于httprouter&#xff0c;速度提高了近 40 倍。点击此处访问Gin官方中文文档。 二、安装 1、安装Gin go get -u github.com/gin-gonic/gin 2、代码中引入 import "githu…

【Docker】——安装镜像和创建容器,详解镜像和Dockerfile

前言 在此记录一下docker的镜像和容器的相关注意事项 前提条件&#xff1a;已安装Docker、显卡驱动等基础配置 1. 安装镜像 网上有太多的教程&#xff0c;但是都没说如何下载官方的镜像&#xff0c;在这里记录一下&#xff0c;使用docker安装官方的镜像 Docker Hub的官方链…

进阶篇05——存储过程、存储函数、触发器

存储过程 简介 基本语法 创建和调用 -- 创建名为p1的存储过程&#xff0c;小括号里可以跟参数 -- 存储过程个人觉得就是SQL里的函数 create procedure p1() begin-- begin 和 end 之间是封装的SQL语句-- 可以是一条SQL也可以是多条SQLselect * from student; end;-- 调用存储…

【FreeRTOS】估算栈的大小

参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》 目录 估算栈的大小回顾简介计算说明估计函数用到的栈有多大合计 估算栈的大小 回顾 上一篇文章链接&#xff1a;http://t.csdnimg.cn/Cc8b4 传送门: 上一篇文章 上一篇文章创建的三个任务 /* 创建任务&#xff1a;声 *…

vivado SITE

描述 SITE是一个设备对象&#xff0c;表示许多不同类型的逻辑资源之一 可在目标Xilinx FPGA上获得。 SITE包括SLICE/CLB&#xff0c;它们是基本逻辑元件&#xff08;BEL&#xff09;的集合&#xff0c;如 查找表&#xff08;LUT&#xff09;、触发器、多路复用器&#xff0c;携…

网页钓鱼-克隆修改--劫持口令下载后门

免责声明:本文仅做技术交流与学习... 目录 1-右键另存为 2-goblin项目(不推荐) 修改goblin.yaml文件 运行exe ​编辑 3-Setoolkit (kali自带) 网页克隆---> 1-右键另存为 --不行就再定位元素进行修改. 2-goblin项目(不推荐) GitHub - xiecat/goblin: 一款适用于红蓝…

力扣每日一题 6/19 排序+动态规划

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 2713.矩阵中严格递增的单元格数【困难】 题目&#xff1a; 给你一个下标从…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 部门组队编程(200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

项目3:从0开始的RPC框架(扩展版)-3

七. 负载均衡 1. 需求分析 目前我们的RPC框架仅允许消费者读取第一个服务提供者的服务节点&#xff0c;但在实际应用中&#xff0c;同一个服务会有多个服务提供者上传节点信息。如果消费者只读取第一个&#xff0c;势必会增大单个节点的压力&#xff0c;并且也浪费了其它节点…

文件扫描工具都有哪些?职场大佬都在用的文本提取工具大盘点~

回想起刚毕业初入职场那阵子&#xff0c;领导让帮忙把纸质文件扫描提取为文本时&#xff0c;还只会傻乎乎地一点点操作&#xff0c;属实是费劲得很&#xff01; 好在后面受朋友安利&#xff0c;找到了4个能够快速实现文件扫描文字提取的方法&#xff0c;这才让我的办公效率蹭蹭…

GD32如何设计晶振电路

关于晶振电路真的简单吗&#xff1f;如何可靠的设计好GD32晶振电路&#xff0c;我们需要知道这些&#xff1a; 1、GD32可以选择哪些范围大小晶振&#xff1f; 以GD32F303为例&#xff0c;查询DATASHEET外部时钟电气特性小节可以看到晶振支持范围是4—32M范围均可选择 2、需不…

JupyterLab使用指南(六):JupyterLab的 Widget 控件

1. 什么是 Widget 控件 JupyterLab 中的 Widget 控件是一种交互式的小部件&#xff0c;可以用于创建动态的、响应用户输入的界面。通过使用 ipywidgets 库&#xff0c;用户可以在 Jupyter notebook 中创建滑块、按钮、文本框、选择器等控件&#xff0c;从而实现数据的交互式展…