概述
Support Annotation Library是在Android Support Library19.1版本開始引入的一個全新的函數包,它包含了諸多有用的元註解。用來幫助開發者在編譯期間發現可能存在的bug。Support Library自己也使用Annotations Library提供的註解來完善Library的代碼質量。
Android的每個版本都在不斷的完善Annotation Library,在Android Support Library22.2版本中,又新增了13種新的Annotation Library註解。Android Support Library發展到25,已經有多個獨立的jar,如咱們常見的Support-v4,Support-v7…java
Annotation Library的使用
若是咱們的sdk安裝了Android Support Respository,那麼咱們能夠打開工程的Srrucure,選中Module,選中Dependencies選項卡,點擊添加按鈕,選中Android Library。而後經過gradle能夠很容易的把這些註解添加到咱們的工程中。android
compile 'com.android.support:support-annotations:23.1.1'
經常使用註解
Nullness註解
使用@NonNull註解修飾的參數不能爲null。在下面的代碼例子中,咱們有一個取值爲null的name變量,它被做爲參數傳遞給sayHello函數,而該函數要求這個參數是非null的String類型:web
public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String name = null; sayHello(name); } void sayHello(@NonNull String s) { Toast.makeText(this, "Hello " + s, Toast.LENGTH_LONG).show(); } }
因爲代碼中參數String s使用@NonNull註解修飾,所以IDE將會以警告的形式提醒咱們這個地方有問題。
api
資源類型註解
咱們知道在Android中,資源一般以整型表示,並保存在R.java中,這意味着若是資源傳的是String類型,則編譯就會報錯,爲了給開發者以提示,Android有了資源類型註解,在最新的版本中,每種資源都對應一種註解。
常見的資源型註解以下:
AnimRes
AnimatorRes
AnyRes
ArrayRes
AttrRes
BoolRes
ColorRes
DimenRes
DrawableRes
FractionRes
IdRes
IntegerRes
InterpolatorRes
LayoutRes
MenuRes
PluralsRes
RawRes
StringRes
StyleRes
StyleableRes
TransitionRes
XmlRes多線程
類型定義註解
在Android開發中,整型不只用來表明資源引用值,還能夠用來表明枚舉,IntDef註解就是用來定義整型的新註解,咱們能夠用來標記咱們本身編寫的api,例如:ide
public class IceCreamFlavourManager { private int flavour; public static final int VANILLA = 0; public static final int CHOCOLATE = 1; public static final int STRAWBERRY = 2; @IntDef({VANILLA, CHOCOLATE, STRAWBERRY}) public @interface Flavour { } @Flavour public int getFlavour() { return flavour; } public void setFlavour(@Flavour int flavour) { this.flavour = flavour; } }
這時若是咱們使用錯誤的整型值調用IceCreamFlavourManager.setFlavour時,IDE將報錯。
固然咱們也能夠指定整型值做爲標誌位,也就是說這些整型值可使用’|’或者’&’進行與或等操做。若是咱們把@Flavour定義爲以下標誌位。svg
@IntDef(flag = true, value = {VANILLA, CHOCOLATE, STRAWBERRY}) public @interface Flavour { }
那麼咱們能夠這麼調用。函數
iceCreamFlavourManager.setFlavour(IceCreamFlavourManager.VANILLA & IceCreamFlavourManager .CHOCOLATE);
@StringDef用法和@IntDef基本差很少。gradle
權限註解
在Android中,有不少場景都須要使用權限,不管是Marshmallow以前仍是以後的動態權限管理.都須要在manifest中進行聲明,若是忘記了,則會致使程序崩潰. 好在有一個註解能輔助咱們避免這個問題.使用RequiresPermission註解便可。ui
@RequiresPermission(Manifest.permission.SET_WALLPAPER) public void changeWallpaper(Bitmap bitmap) throws IOException { }
Color值限定註解
上面部分提到了ColorRes,用來限定顏色資源id,這裏咱們將使用ColorInt,一個用來限定Color值的註解. 在較早的TextView的setTextColor是這樣實現的。
public void setTextColor(int color) { mTextColor = ColorStateList.valueOf(color); updateTextColors(); }
線程註解
Android開發中常常會涉及到不少線程,如主線程,子線程等操做。我相信你們在使用什麼EventBus,消息總線…看的比較多,Android中提供了四個與線程相關的註解。
- @UiThread,一般能夠等同於主線程,標註方法須要在UIThread執行,好比View類就使用這個註解
- @MainThread 主線程,常常啓動後建立的第一個線程
- @WorkerThread 工做者線程,通常爲一些後臺的線程,好比AsyncTask裏面的doInBackground就是這樣的.
- @BinderThread 註解方法必需要在BinderThread線程中執行,通常使用較少.
例如大名鼎鼎的AsyncTask。
new AsyncTask<Void, Void, Void>() { //doInBackground is already annotated with @WorkerThread @Override protected Void doInBackground(Void... params) { return null; updateViews();//error } }; @UiThread public void updateViews() { Log.i(LOGTAG, "updateViews ThreadInfo=" + Thread.currentThread()); }
注意,這種狀況下不會出現錯誤提示。
new Thread(){ @Override public void run() { super.run(); updateViews(); } }.start();
雖然updateViews會在一個新的工做者線程中執行,可是在compile時沒有錯誤提示。由於它的判斷依據是,若是updateView的線程註解(這裏爲@UiThread)和run(沒有線程註解)不一致纔會錯誤提示.若是run方法沒有線程註解,則不提示。
CallSuper重寫函數註解
重寫的方法必需要調用super方法。使用這個註解,咱們能夠強制方法在重寫時必須調用父類的方法 好比ApplicationonCreate,onConfigurationChanged等。
@Keep註解
在Android編譯生成APK的環節,咱們一般須要設置minifyEnabled爲true實現下面的兩個效果
混淆代碼
刪除沒有用的代碼
可是出於某一些目的,咱們須要不混淆某部分代碼或者不刪除某處代碼,除了配置複雜的Proguard文件以外,咱們還可使用@Keep註解 。
@Keep public static int getBitmapWidth(Bitmap bitmap) { return bitmap.getWidth(); }
返回值註解
咱們開發的時候,有時候須要對返回的值作一些出來,那麼久用到了@CheckResult註解,若是一個方法獲得告終果,卻沒有使用這個結果,就會有錯誤出現,一旦出現這種錯誤,就說明你沒有正確使用該方法。
@CheckResult public String trim(String s) { return s.trim(); }
註解在Android開發中隨處能夠看到,如ButterKnife,afinal,eventbus等,這些都大大提升了咱們的開發效率。
本文同步分享在 博客「xiangzhihong8」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。