安卓设备和API

3
我有一个应用程序,当编译为API 18和19时表现不同(重复警报的行为)。
我将我的应用程序编译为API 19(Google API)。我在设备上运行它,并看到Build.VERSION.SDK_INT返回16。
我理解这意味着16是我的设备当前可以运行的最大API号码。
我只想确认:在这种情况下,无论我是否将其编译为API 18或19,我的应用程序是否会在这样的设备上运行相同?

我建议你看一下这篇帖子 - https://dev59.com/D2455IYBdhLWcg3wD_sB - Tal Kanel
3个回答

2
我有一个应用程序,当编译为API 18和19时(重复警报的行为)会表现出不同的行为。 AlarmManager 的核心行为并不取决于您如何编译应用程序。它取决于设备的操作系统级别以及更重要的是您的android:targetSdkVersion
基于如何编译应用程序(即,Eclipse中Project>Properties>Android中的构建目标)对AlarmManager的唯一影响是您是否可以直接访问新设备上的其他方法(例如,setExact())。
在这种情况下,无论我是否将其编译为API 18或19,我的应用程序在此类设备上运行是否相同?
即使我们将“编译”转换为“设置 android:targetSdkVersion”,在抽象情况下这是不可能回答的。尽管如此,某些行为变化将会发生在较新设备上,而不考虑android:targetSdkVersion;仅当您的android:targetSdkVersion设置为该API级别或更高级别时才会在较新设备上发生某些行为变化。
AlarmManager的特定情况下,JavaDocs涵盖了感兴趣的特定Build.VERSION_CODES值的文档,例如KITKAT:

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

这也在AlarmManager本身的文档中反映出来,例如文档中的AlarmManager部分

目标SDK版本早于API 19的应用程序将继续看到以前的行为,即所有警报都在请求时准确传递。


你的例子比我好,因为它与用户所要求的闹钟相关。哈哈 - Bear
我真的谈到了“AlarmManager.set被解释为不精确值,以便系统在安排闹钟时更具灵活性”的问题。因此,如果我将我的代码编译为API 19,并在API 16的设备上运行它,它将表现得好像我为API 16编译了它(闹钟应该在精确时间运行)? - Gari BN
1
目标API 19+ 设备API 16 ---> 在API 16上的行为 - Bear
@GariBN:是的。然而,这应该被视为一种权宜之计。最终,你会发现某些事情会迫使你想要将android:targetSdkVersion提高到19或更高版本。但这给了你一个时间窗口,可以预算时间来重新设计你的AlarmManager代码以考虑这些变化。 - CommonsWare
@Bear 这很奇怪,因为我发现闹钟启动的时间并不是非常准确(虽然我无法在API 19设备上运行以进行比较)。 - Gari BN
1
@GariBN:“我看到警报触发的时间不是很准确”-- 可能有许多问题(例如,使用 _WAKEUP 警报,但没有使用 WakefulBroadcastReceiverWakefulIntentService 模式)会导致这种情况。您还可以使用 adb shell dumpsys alarm 查看当前预定的警报。 - CommonsWare

2

目标API与您的设备API不同

例如,如果您将目标API设置为16,则可以访问所有版本<= 16的API。当您在具有更新API的设备上运行时,它仍将按照所有公共API应向后兼容的方式工作。

但在某些情况下,目标API确实会改变应用程序的行为。例如,KitKat Webview已经发生了很多变化,一些旧代码实际上与KitKat API存在冲突。但是为了保持向后兼容性,它不会在目标API< KitKat时崩溃。但是,如果您将目标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);
    }

那么,我的应用程序在使用API 16的设备上,对于18和19目标API,行为会完全相同吗? - Gari BN
是的,因为它会停留在API级别16。因此,它的行为就像您指定了targetSdkVersion = 16一样。 - Phantômaxx

1
你应该使用模拟器... 尽可能多地设置运行不同操作系统版本的设备。 我知道它们很慢,但它们是非常有价值的帮助。
你的设备运行在API Level 16上,因为安装了Jelly Bean(版本4.1或版本4.1.1)。 因此,它向后兼容到minSdkVersion(在你的清单文件中定义)。
你的targetSdkVersion应始终是最新的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接