1. 程式人生 > >6.3Android程式設計權威指南(第3版)————安全新增新版本API中的程式碼

6.3Android程式設計權威指南(第3版)————安全新增新版本API中的程式碼

應用的SDK最低版本和編譯版本間的差異較大,由此帶來的相容性問題需要處理。例如,在應用中,如果呼叫了KitKat(API 19級)以後的SDK版本中的程式碼會怎麼樣呢?結果顯示,在 KitKat 裝置上安裝執行時,應用會崩潰。

假如APP的minSDKVersion是19,新增如下程式碼,該程式碼是API21之後出現的

int cx = mShowAnswerButton.getWidth() / 2;
int cy = mShowAnswerButton.getHeight() / 2;
float radius = mShowAnswerButton.getWidth();
Animator anim = ViewAnimationUtils
.createCircularReveal(mShowAnswerButton, cx, cy, radius, 0);
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
mShowAnswerButton.setVisibility(View.INVISIBLE);
}
});
anim.start();

Android Lint會立即提示,這段程式碼對於最低版本SDK是不安
全的。如果沒看到提示,請選擇Analyze → Inspect Code…選單項手動觸發Lint。因為SDK編譯版本為API 21級,編譯器本身編譯程式碼沒有問題,而Android Lint知道專案SDK最低版本,所以及時指出了問題。

該怎麼消除這些錯誤資訊呢?
一種辦法是提升SDK最低版本到21。然而,提升SDK最低版本只是迴避了相容性問題。如果應用不能安裝在API 19級和更老版本裝置上,那麼也就不存在新老系統的相容性問題了。因此,實際上這並沒有真正解決相容性問題。比較好的做法是將高API級別程式碼置於檢查Android裝置版本的條件語句中。
如下:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int cx = mShowAnswerButton.getWidth() / 2;
int cy = mShowAnswerButton.getHeight() / 2;
float radius = mShowAnswerButton.getWidth();
Animator anim = ViewAnimationUtils
.createCircularReveal(mShowAnswerButton, cx, cy, radius, 0);
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
mShowAnswerButton.setVisibility(View.INVISIBLE);
}
});
anim.start();
} else {
mShowAnswerButton.setVisibility(View.INVISIBLE);
}

PS:Build.VERSION.SDK_INT常量代表了Android裝置的版本號。可將該常量同代表Lollipop版本的常量進行比較