- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在学习 android 上的 Udacity 类(class),这些术语似乎让我感到困惑(我使用的是 android studio 1.x 最新版本)在我的 build.gradle 中我有这些
compileSdkVersion 21
buildToolsVersion "21.1.2"
......
minSdkVersion 10
targetSdkVersion 20
versionCode 1
versionName "1.0"
....
compile 'com.android.support:appcompat-v7:20.0.0'
我的假设如果我将应用程序主题保留为我的 list 文件中的默认设置,我将其设置为使用 app:theme
并且在 styles.xml 中默认为
appcompat.light.darkaction bar
我弄清楚了 appcompat
主题的意思,无论设备操作系统版本如何,它都会更改为使用目标 SDK 版本的主题
当我选择 API 21 时,它看起来像一个 Material 应用程序当我选择 API 20 时,它看起来像一个 kitkat 应用程序(都在我运行 ICS 的设备上)
因此无论设备操作系统如何,目标 SDK 都会控制我的应用程序的外观,它定义了设备可以支持的最高版本的 android,对吗?默认情况下,外观会更改为最新版本或目标 API 外观,同时使用 app:compat 主题仍然使其能够在较低的 sdks 上运行,因为低作为 API 10
minsdk 是支持的最小值,
我到这里了吗?
现在让我困惑的是
什么是编译 SDK,它应该总是最新的吗?
示例: Material 没有在操作栏图标中显示应用程序图标,我不喜欢它,并切换到 API 20跟随 MOOC 视频
但是我应该将 compile sdk 保留为 21,这不会让应用程序看起来像 material,因为我很困惑,因为它没有?
最后一个问题,我想在运行 Gingerbread 的设备上测试应用程序,我没有,你能为 Gingerbread 设备推荐一些典型的 AVD 配置吗(因为我知道很多人在发展中国家仍然使用它),我应该使用适合典型 Gingerbread 设备的内存、屏幕尺寸和像素密度?
最佳答案
so target SDK is controlling the look and feel of my app irrespective of device OS,
是的。 (除其他事项外)
it defines what highest version of android the device can support , right?
不!目标 SDK 表示您用于测试应用程序的 SDK。您可以使用目标 SDK 20 并在安装了 API 21 的设备上运行您的应用程序:它将使用 KitKat l&f(即级别 20)。
这怎么可能?当面向 API 20 的应用程序在具有 API 21 的设备上运行时:系统将自动启用一些向后兼容性钩子(Hook),以便您的应用程序的行为就像它在操作系统的旧版本(即 targetVersion)上一样.
支持的最大 sdk 是 maxSdk 属性(很少使用,不推荐)。如果您指定 maxSdk 20:您将无法在运行 SDK 21+ 的设备上安装您的应用
编译 SDK 级别是您用于编译应用的 SDK 版本。如果您选择最新版本:最新 android 版本的用户将受益于为他们优化的代码。它将允许您使用 sdk 的最新功能...但是当您使用新的 api 编写代码时要小心,因为它会在旧设备上崩溃。(请参阅此处)
最低 sdk 版本可能低于编译 sdk。在您的示例中,您声明您的代码可以在 API 级别 10 上执行,但可以使用 api 级别 21 编译......没关系,但您必须确保对 API-10 中不存在的 API 的每次调用都不会在运行 API-10 的设备上执行。
让我们来说明这个棘手的问题。假设:compileSdk = 20; targetSdk = 20 和 minSdk = 10
if (Build.VERSION.SDK_INT >= 13) {
apiCallToSomethingAvailableOnlySinceApi13();
}else {
//put here some alternative code to perform something similar
//(but probably degraded) feature
//on device running API 10, 11 or 12
//device with api 9 or lower are exclude anyway (because minSdk is 10)
}
总结:
minSDK :可以在至少具有此级别的设备上安装该应用程序,并且开发人员编写了防御代码以确保不会执行比 minSdk 最近的所有对 api 的调用运行 minSdk 版本的设备。
targetSDK:该应用已在此级别上进行测试,更新的设备必须启用向后兼容性 Hook ,以便该应用即使在该级别上仍能正常运行在更新的设备上。
compileSDK :代码经过优化以在此级别上运行。 (通常安全地把它和 targetSDK 一样)
maxSDK:您不能在运行更高 API 的设备上安装该应用(不推荐,大多数时候没有用)。
关于android - 关于 android API 级别的困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27729503/
我有一个程序可以打开一个窗口并快速改变背景颜色并随机弹出矩形和椭圆形。我的代码有效,但我不知道为什么,因为我没有在我的代码中调用 repaint() 函数。当我使用我个人的 update() 函数包含
var allRapidSpells = $$('input[value^=RSW]'); 谁能告诉我这是做什么的? 最佳答案 我敢猜测您正在使用 MooTools ,一个 JavaScript 框架
我有一个抽象父类,它有多个子类。我希望 child 能够拥有一个对于该 child 的每个实例都相同的变量。我不想将构造函数传递给 child 来告诉它它的名字,因为当它可以被硬编码时,这看起来很愚蠢
我刚刚在 Git 存储库上做了一些糟糕的事情,我不知道如何解决这个问题。我什至不知道我是怎么把它弄成这样的……! 在存储库(托管在 git hub 上)上,有 3 个我感兴趣的分支:master、br
我是 GIT 的新手,在理解提交日志图时遇到问题。 我感觉每条平行线都是一个分支。虽然我的源代码只有 2 个分支。我在下面提供的提交日志图中看到 3-4 条平行线(Microsoft Team Ser
我是 WPF 的新手,ScrollViewer 让我很沮丧。要么我只是没有“得到”它,要么它是一种有限的控制。 这是我的挫折: 水平滚动错误 水平滚动条仅在列表底部可见(我必须滚动到底部才能看到) 坏
那么 $('table.selectable td.capable input:text') 比 $('table.selectable td input:text') 更好吗?换句话说,指定一个类会
我刚刚完成了计算机图形学类(class),我们必须对光线追踪器进行编程。尽管所有结果都是正确的,但我对 OpenMP 的使用感到困惑(顺便说一句,这不是类(class)的一部分)。我有这个循环(C++
与 PatternSynonyms ( explicitly bidirectional form ),pattern-to-expr 方程实际上形成了一个函数,但拼写为大写(假设您最终得到正确类型的
我是 javascript/coffeescript 新手。 有人可以解释一下为什么这个 CoffeeScript/JavaScript 会毫无延迟地快速通过吗?我对第一种情况的想法是,它是对 upd
如果我调用document.getElementsByClassName('cl'),我会得到一个 HTMLCollection。它似乎包含 Element 对象而不是 HTMLElement 对象,
这是我本月的 azure payasyougo 使用费用。 我很难理解为什么我要为标准中型应用服务付费,我认为它会包含在计算时间中?我只运行一个云服务,这对于一个没有做太多事情的云服务来说似乎有点陡峭
除了the issue I am already having之外,我还在I saw a video on it之后安装了HBase(尚未安装)之前,还安装了Zookeeper。在安装它时,我遇到了许
我正在将 XSLT 与 regexp:match exslt 函数一起使用。上述函数采用 JavaScript Regex 模式。因此,我尝试匹配一组数字 1 到 3 OR 5 到 7 OR 9 到
我想知道为什么这段代码会给出消息:SyntaxError:意外的标记其他。 var compare = function(choice1,choice2){ if(choice1===choice2)
我尝试使用复选框和 JQuery 过滤日历上的事件, $(document).ready(function () { $('.scrollable-menu :checkbox').click(f
假设我们有一个用户想要一个名为:“test/lasdhjal.txt”,无论如何。现在,如果我将其放入新的文件(输入)中;对象里面,它会认为 test/是一个文件夹,而它是名称的一部分。我能做什么呢?
问题是 stash 的更改不会留在我 stash 它们的分支中。其他分支存储将被覆盖示例: 我愿意: git checkout iss4 // made some changes gi
我是一个 java 新手,并且在 StackOverflow 错误/在类之间访问文件的能力方面遇到了一个非常令人困惑的问题。我知道根本原因可能是我进行了一些递归调用,但修复它的语法却让我无法理解。我认
public X createData(int n) { int[] values = new int[n]; Random rand = new Random(); for
我是一名优秀的程序员,十分优秀!