Android 安卓设备和API

Android 安卓设备和API,android,Android,我有一个应用程序,当为API 18和19编译时,其行为会有所不同(重复报警的行为) 我为API 19(谷歌API)编译了我的应用程序。我在设备上运行了它,发现Build.VERSION.SDK_INT返回16 我知道这意味着16是我的设备当前可以运行的最大API编号 我只是想验证一下:在这种情况下,我的应用程序会在这样的设备上运行相同的程序吗,不管我是为API 18还是19编译的?目标API!=您的设备api 例如,如果将目标API设置为16,则可以访问版本为的所有API。您应该使用模拟器… 尽

我有一个应用程序,当为API 18和19编译时,其行为会有所不同(重复报警的行为)

我为API 19(谷歌API)编译了我的应用程序。我在设备上运行了它,发现Build.VERSION.SDK_INT返回16

我知道这意味着16是我的设备当前可以运行的最大API编号


我只是想验证一下:在这种情况下,我的应用程序会在这样的设备上运行相同的程序吗,不管我是为API 18还是19编译的?

目标API!=您的设备api


例如,如果将目标API设置为16,则可以访问版本为的所有API。您应该使用模拟器…
尽可能多地设置运行不同操作系统版本的设备。
我知道他们很慢,但他们是一个无价的帮助

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

您的targetSdkVersion应该始终是最新的

我有一个应用程序,当为API 18和19编译时,其行为会有所不同(重复报警的行为)

AlarmManager
的核心行为并不取决于您如何编译应用程序。它取决于设备的操作系统级别,更重要的是取决于您的
android:targetSdkVersion

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

在这种情况下,我的应用程序会在这样的设备上运行相同的程序吗,不管我是为API 18还是19编译的

这是不可能在抽象中回答的,即使我们将“编译它”转换为“设置
android:targetSdkVersion
”。无论android:targetSdkVersion,新设备上都会发生一些行为变化;只有当您的
android:targetSdkVersion
设置为该API级别或更高级别时,新设备上才会发生某些行为更改

AlarmManager
的特定情况下,特定
Build.VERSION\u code
感兴趣的值的JavaDocs中包含了其中一些内容:

AlarmManager.set被解释为不精确的值,以使系统在安排报警时具有更大的灵活性

它也会在中产生共鸣,例如:

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


那么,对于18和19目标API,我的应用程序在具有API 16的设备上的行为是否完全相同?是的,因为它将在API级别16停止。因此,它的行为就像您指定了targetSdkVersion=16一样。我建议您查看该帖子-您的示例比我好,因为它与用户要求的警报有关。hahaI真的谈到了“AlarmManager.set被解释为一个不精确的值,以使系统在安排报警时具有更大的灵活性”。因此,如果我为API 19编译代码,并且它在带有API 16的设备上运行,那么它的行为就好像我为API 16编译代码一样(警报应该在准确的时间内运行)?目标API 19+设备API 16->带有API的行为16@GariBN:是的。然而,这应该被视为权宜之计。最终,你会发现一些东西迫使你想要将你的
android:targetSdkVersion提升到19或更高。但这为您提供了一个窗口,在该窗口中,您可以根据这些更改预算时间来重新编写
AlarmManager
代码。@GariBN:“我发现报警触发得不太准确”--可能存在许多问题(例如,在不使用WakefulBroadcastReceiver
或WakefulIntentService模式的情况下使用
\u WAKEUP
报警可能会导致此问题。您也可以使用
adb shell dumpsys alarm
查看当前计划的报警。
    if (Utils.isKitKatOrLater()) {
        am.setExact(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);
    } else {
        am.set(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);
    }