Android中的targetsdkversioin

android飛魚發表於2018-12-05

對於Android初學開發者來說,

可能會好奇 targetsdkversioin這個配置是用來幹嘛的。
也有很多一兩年開發經驗的 Android碼農會在面試中被問到這個問題。

Api Level是個什麼東西?

Android的api在版本間變化可能非常大,
有時候一個 api在低版本支援,到了高版本就被刪除了。
可以在 develop網站上看到 api level對應的 Android版本,
xxx.jpg

舉個例子,Activity.getActionBar()
xxxx.jpg

可以看到 api level 11,也就是說3.0之前是沒有這個api的,
3.0之前的機器執行不了用了這個api的app。

targetsdkversioin

以上面 getActionBar()的例子來說,
我們的app現在可以指定 targetsdkversioin = 11,
這意味著安裝時會通知系統,開發者已經在 3.0系統上測試過沒問題,
如果安裝的系統 api level高於11,則會開啟相容模式來執行app。

就像 Android 6.0引入的動態許可權申請,
如果你把 targetsdkversioin定位比6.0低的 api level的話,
其實是不需要動態去申請許可權,
在app安裝時,系統會以相容模式預設開啟這些許可權。

然而問題在於,
設定 targetsdkversioin = 21(比如5.0對應的 api level 21),
意味著向系統表明我們只在 5.0系統測試過,
如果是執行在6.0的機器而使用者手動關掉所需要的許可權的話,
我們的應用是會崩潰的,系統並不會幫我們處理掉相容性的問題。

@TargetApi

和 targetsdkversioin相對應的還有 @TargetApi這個註解,
還是以上  getActionBar()為例子來說明

如果我們預期app可以執行在 api level < 11的機器上,
而因為UI設計或者其他原因,非要用 getActionBar()方法的時候,
@TargetApi就有作用了

對於這種情況,
通常會在程式碼中用 Build.VERSION.SDK_INIT 來判斷,比如下面的程式碼,

if(Build.VERSION.SDK_INIT > 10) {
    ....
    goWithActionBar();
} else {
    ....
}

@TargetApi(11)
public void goWithActionBar(){
    ....
}

這意味著 goWithActionBar()這個方法是在 api level以上可以使用的,
不加這個註解的話,編譯系統會提示相容性錯誤而導致編譯不過,
因此 @TargetApi主要是用來抑制編譯時的相容性問題的。

更多Android進階技術,面試資料系統整理分享,職業生涯規劃,產品,思維,行業觀察,談天說地。可以加Android架構師群;701740775。


相關文章