我有一个应用程序在为API 18和19编译时表现不同(重复警报的行为)。
我编译了API 19(Google API)的应用程序。我在设备上运行它,看到Build.VERSION.SDK_INT返回16。
我知道这说明16是我的设备当前可以运行的最大API编号。
我只是想验证:在这种情况下,我的应用程序在这样的设备上运行是否相同,无论我是否为API 18或19编译它?
答案 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应该始终是最新的。