我有一個應用程序在針對API 18和19(重複警報行爲)進行編譯時行爲有所不同。Android。設備和API
我編譯了API 19(Google API)的應用程序。我在設備上運行它,發現Build.VERSION.SDK_INT返回了16.
據我所知,這表示16是我的設備當前可以運行的最大API數。
我只是想驗證一下:在這種情況下,無論我是否爲API 18或19編譯它,我的應用程序在這樣的設備上運行相同嗎?
我有一個應用程序在針對API 18和19(重複警報行爲)進行編譯時行爲有所不同。Android。設備和API
我編譯了API 19(Google API)的應用程序。我在設備上運行它,發現Build.VERSION.SDK_INT返回了16.
據我所知,這表示16是我的設備當前可以運行的最大API數。
我只是想驗證一下:在這種情況下,無論我是否爲API 18或19編譯它,我的應用程序在這樣的設備上運行相同嗎?
我有一個應用程序,在針對API 18和19(重複警報行爲)進行編譯時行爲有所不同。
的AlarmManager
的核心行爲是不取決於你如何編譯應用。它是取決於設備的操作系統級別,更重要的是,您的android:targetSdkVersion
。
AlarmManager
根據您編譯應用程序(即您的構建目標,Eclipse中的項目>屬性> Android)的唯一區別在於您是否可以直接訪問新設備上的其他方法(例如,setExact()
)。
在這種情況下,無論我是否爲API 18或19編譯它,我的應用程序在這樣的設備上運行相同嗎?
即使我們將「編譯它」轉換爲「設置android:targetSdkVersion
」,這也不可能在摘要中回答。無論android:targetSdkVersion
如何,新設備上都會發生一些行爲更改;只有當您的android:targetSdkVersion
設置爲該API級別或更高級別時,新設備上纔會發生一些行爲更改。
在AlarmManager
的特定情況下,一些這是覆蓋在JavaDocs獲得感興趣的特定Build.VERSION_CODES
值,such as KITKAT
:
AlarmManager.set變得解釋爲不精確值,以得到系統更靈活地安排警報。
這也反映在the documentation for AlarmManager
itself,如:
應用,其targetSdkVersion比API 19早將繼續看到以前的行爲中,要求在所有報警準確傳遞。
目標API!=您的設備API
例如,如果你設定的目標API爲16,你可以用版本訪問所有API < = 16 當您使用較新的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都一樣? –
請參閱我的更新 – Bear
是的,因爲它會在API級別16停止。所以它的行爲就像您指定targetSdkVersion = 16一樣。 –
您應該使用模擬器...
設爲很多,你可以運行具有不同OS版本的設備。
我知道他們很慢,但他們是非常寶貴的幫助。
由於安裝了Jelly Bean(版本4.1或版本4.1.1),您的設備在API Level 16上運行。
所以它向後兼容minSdkVersion(如清單中所定義)。
你的targetSdkVersion應該是最新的。
我建議你看看該訊息 - http://stackoverflow.com/questions/4568267/android-min-sdk-version-vs-target-sdk-version –