2014-01-14 97 views
3

我有一個應用程序在針對API 18和19(重複警報行爲)進行編譯時行爲有所不同。Android。設備和API

我編譯了API 19(Google API)的應用程序。我在設備上運行它,發現Build.VERSION.SDK_INT返回了16.

據我所知,這表示16是我的設備當前可以運行的最大API數。

我只是想驗證一下:在這種情況下,無論我是否爲API 18或19編譯它,我的應用程序在這樣的設備上運行相同嗎?

+0

我建議你看看該訊息 - http://stackoverflow.com/questions/4568267/android-min-sdk-version-vs-target-sdk-version –

回答

2

我有一個應用程序,在針對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早將繼續看到以前的行爲中,要求在所有報警準確傳遞。

+0

您的示例比我好,因爲它與用戶提出的警報有關。 haha – Bear

+0

我真的在談論「AlarmManager.set被解釋爲一個不精確的值,爲系統提供更大的靈活性來安排警報」。所以,如果我編譯我的API 19的代碼,並且它運行在API 16的設備上,它的行爲就好像我爲API 16編譯它(警報應該在確切的時間運行)? –

+1

target api 19+設備api 16 ---> api行爲16 – Bear

2

目標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); 
    } 
+0

所以,將我的應用程序的行爲完全在API 16的設備上,對於18和19目標API都一樣? –

+0

請參閱我的更新 – Bear

+0

是的,因爲它會在API級別16停止。所以它的行爲就像您指定targetSdkVersion = 16一樣。 –

1

您應該使用模擬器...
設爲很多,你可以運行具有不同OS版本的設備。
我知道他們很慢,但他們是非常寶貴的幫助。

由於安裝了Jelly Bean(版本4.1或版本4.1.1),您的設備在API Level 16上運行。
所以它向後兼容minSdkVersion(如清單中所定義)。

你的targetSdkVersion應該是最新的。