Android系统。设备和API

时间:2014-01-14 14:39:29

标签: android

我有一个应用程序在为API 18和19编译时表现不同(重复警报的行为)。

我编译了API 19(Google API)的应用程序。我在设备上运行它,看到Build.VERSION.SDK_INT返回16。

我知道这说明16是我的设备当前可以运行的最大API编号。

我只是想验证:在这种情况下,我的应用程序在这样的设备上运行是否相同,无论我是否为API 18或19编译它?

3 个答案:

答案 0 :(得分:2)

目标API!=您的设备API

例如,如果将目标API设置为16,则可以访问版本为< = 16的所有API 当您在具有较新API的设备上运行时,它仍然有效,因为所有公共API都应向后兼容

但在某些情况下,目标API会改变应用行为。 例如,kitkat webview已经发生了很大的变化,一些旧的代码实际上与kitkat api有冲突。但为了保持向后兼容性,它不会因目标api而崩溃。奇巧。但是如果你将目标api设置为kitkat,则意味着你知道kitkat中新的api更改,如果你运行那些旧的有问题的代码它会崩溃。要使设备保持旧sdk正常工作,您需要检查设备的sdk版本,并在不同的sdk中运行不同的代码。

因此,对于您的情况,如果您需要在您设置的时间内完全触发警报,请输入以下代码:

    if (Utils.isKitKatOrLater()) {
        am.setExact(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);
    } else {
        am.set(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);
    }

答案 1 :(得分:2)

  

我有一个应用程序在为API 18和19编译时表现不同(重复警报的行为)。

AlarmManager的核心行为取决于您编译应用的方式。 取决于设备的操作系统级别,更重要的是,您的android:targetSdkVersion

AlarmManager基于您编译应用程序的方式(即您的构建目标,项目>属性> Android中的Android)的唯一区别在于您是否可以直接访问其他方法(例如{ {1}})在较新的设备上。

  

在这种情况下,我的应用程序在这样的设备上运行是否相同,无论我是否为API 18或19编译它?

即使我们将“编译它”转换为“设置setExact()”,也不可能在摘要中回答。无论android:targetSdkVersion如何,在较新的设备上都会发生一些行为更改;只有当android:targetSdkVersion设置为该API级别或更高级别时,才会在较新的设备上发生某些行为更改。

android:targetSdkVersion的特定情况下,JavaDocs中针对特定AlarmManager感兴趣的值such as KITKAT涵盖了其中一些内容:

  

AlarmManager.set被解释为一个不精确的值,使系统在调度警报时具有更大的灵活性。

它也在the documentation for AlarmManager itself中得到回应,例如:

  

targetSdkVersion早于API 19的应用程序将继续查看之前的行为,其中所有警报都在请求时准确传递。

答案 2 :(得分:1)

你应该使用模拟器......
设置尽可能多的设备,运行具有不同操作系统版本的设备 我知道他们很慢,但他们是一个非常宝贵的帮助。

您的设备在API级别16上运行,因为安装了Jelly Bean(版本4.1或版本4.1.1) 所以它向后兼容minSdkVersion(在你的Manifest中定义)。

您的targetSdkVersion应该始终是最新的。