Support Annotation Library 使用詳解

Support Annotation Library 是提供了一系列元注解,用來幫助開發(fā)者在編譯期間發(fā)現(xiàn)可能存在的BUG.

1. Nullness 注解

此類注解包含 :

  • @Nullable 作用于函數(shù)參數(shù)和返回值,標(biāo)記參數(shù)或者返回值可以為空.
  • @NonNull 作用于函數(shù)參數(shù)和返回值,標(biāo)記參數(shù)或者返回值不可以為空.

Android Studio 會自動提示注解錯誤.

注解錯誤

2. 資源類型注解

在Android中資源通常用整形值表示,保存在R文件中. 這樣存在的問題就是如果一個需要使用Layout資源的地方傳入了一個String類型的資源編譯期間也不會報(bào)錯,只有在運(yùn)行到相應(yīng)代碼時(shí)才會發(fā)現(xiàn)錯誤. 使用資源型注解就可以解決這個問題.

注解符號 標(biāo)記類型
@AnimatorRes android.R.animator
@AnimRes android.R.anim
@AnyRes 標(biāo)記整形值是任意一種資源
@ArrayRes android.R.array
@AttrRes android.R.attr
@BoolRes 整形值是布爾類型
@ColorRes android.R.color
@Drawable android.R.drawable
@IdRes android.R.id
@FracriionRes fraction類型,這種比較少見,這種資源類型常見于Animation XML中.
@IntegerRes android.R.layout
@InterpolatorRes android.R.interpolator
@LayoutRes android.R.layout
@MenuRes android.R.menu
@PluralsRes android.R.plurals 表示復(fù)數(shù)字符串.
@RawRes android.R.raw
@StringRes android.R.string
@StyleableRes android.R.styleable
@StyleRes android.R.style
@TransitionRes 標(biāo)記 transition類型
@XmlRes android.R.xml

3. 類型定義注解

在Android開發(fā)中,整數(shù)值不僅用來代表資源值,也經(jīng)常用來代表枚舉值. 使用@IntDef 注解可以定義一個新的整形類型的注解.

用法一 : 定義范圍

// 定義可以接收的常量列表.
@IntDef({X_1,X_2,X_3})
// 定義注解.
public @interface TestMode {}
// 定義常量
public final static int X_1 = 0x01;
public final static int X_2 = 0x02;
public final static int X_3 = 0x03;
// 使用定義的注解, 如果mode不是三個常量之一Android Studio會給出警告.
public void setTestMode(@TestMode int mode){

}
@TestMode
public int getTestMode(){
    return X_1;
}
// 使用
public void test(){
    setTestMode(X_1);
}

用法二 : 定義一個flag標(biāo)志位,來識別函數(shù)參數(shù)或者返回值是否符合某一種模式.

// 定義范圍
@IntDef(flag = true, value = {
        XX_1,XX_2,XX_3
})
// 定義注解
public @interface TestMode2 {}
// 定義常量
public static final int XX_1 = 0x01;
public static final int XX_2 = XX_1 << 1;
public static final int XX_3 = XX_1 << 2;
// 使用
@TestMode2
public int getMode2(){
    return XX_1;
}
public void setMode2(@TestMode2 int mode2){

}
public void test2(){
    // 這種模式下可以使用多個并在一起
    setMode2(XX_1 | XX_3);
}

4. 線程注解

  • @UiThread : 標(biāo)記運(yùn)行在UI線程.
  • @MainThread : 運(yùn)行在主線程,一個應(yīng)用只有一個主線程,主線程也是@UIThread線程,通常情況下我們可以使用@MainThread 來注解生命周期相關(guān)的函數(shù),使用@UiThread 來注解視圖相關(guān)的函數(shù),一般情況下兩者可以互換.
  • @WorkerThread : 標(biāo)記運(yùn)行在后臺線程.
  • @BinderThread : 標(biāo)記運(yùn)行在Binder線程中.
@UiThread
public void testUiThread(){
    Log.d(TAG,"運(yùn)行在UI線程中");
}
@MainThread
public void testMainThread(){
    Log.d(TAG, "運(yùn)行在主線程");
}
@WorkerThread
public void testWorkerThread(){
    Log.d(TAG, "運(yùn)行在后臺線程");
}
@BinderThread
public void testBinderThread(){
    Log.d(TAG, "運(yùn)行在Binder線程");
}

5. 值范圍注解

當(dāng)函數(shù)取值是一定范圍時(shí),我們可以使用值范圍注解來防止調(diào)用這傳入錯誤參數(shù).

  • @Size : 對于集合赠潦、數(shù)組和字符串之類的參數(shù),開使用@Size注解來表示這些參數(shù)的大小.

    • @Size(min=1) // 集合幣可以為空
    • @Size(max=4) // 字符串最大字符個數(shù)是4.
    • @Size(2) // 數(shù)組元素兩個.
    • @Size(multiple=2) //數(shù)組大小是2 的倍數(shù).
// 數(shù)組不能為空
public void testRange1(@Size(min = 1) final byte[] bbs){
}
// 數(shù)組長度大4
public void testRange2(@Size(max = 4) final byte[] bbs){
}
// 兩個字符
public void testRange3(@Size(2) String string){
}
// 長度是 2 的倍數(shù).
public void testRange4(@Size(multiple = 2) String string){
}
  • @IntRange : 參數(shù)可以是 int 或者 long
// 0-255
public void testRange5(@IntRange(from = 0,to = 255) int alpha){
}
  • @FloatRange : 參數(shù)是float或者double
// 0.0-255.0
public void testRange6(@FloatRange(from = 0.0,to = 255.0) float alpha){
}

6. 權(quán)限注解

Android 應(yīng)用在使用某些系統(tǒng)功能時(shí),需要在AndroidManifest.xml中聲明權(quán)限,否則運(yùn)行會報(bào)錯. 使用權(quán)限注解@RequiresPermission 可以幫助我們在編譯時(shí)找出錯誤.

  • 需要聲明一個權(quán)限
// 調(diào)用此方法需要聲明權(quán)限.
@RequiresPermission(Manifest.permission.SET_WALLPAPER)
public void testPermissionAnnotation() {
}
  • 需要聲明集合中的至少一個權(quán)限
// 調(diào)用此方法需要聲明下面任何一個權(quán)限.
@RequiresPermission(anyOf = {
        Manifest.permission.ACCESS_COARSE_LOCATION,
        Manifest.permission.ACCESS_FINE_LOCATION})
public void testPermission2(){}
  • 需要聲明集合中的所有權(quán)限
// 調(diào)用此方法需要聲明下面所有的權(quán)限.
@RequiresPermission(allOf = {
        Manifest.permission.ACCESS_COARSE_LOCATION,
        Manifest.permission.ACCESS_FINE_LOCATION})
public void testPermission3(){}
  • Intent 調(diào)用所需權(quán)限,可以在Intent的ACTION字符串定義處添加注解
// Intent 的這個Action需要使用如下權(quán)限
@RequiresPermission(Manifest.permission.EXPAND_STATUS_BAR)
public static final String ACTION_MY = "custom_action";
  • ContentProvider 同時(shí)需要讀寫
// 對于ContentProvider
@RequiresPermission.Read(@RequiresPermission(Manifest.permission.READ_CALENDAR))
@RequiresPermission.Write(@RequiresPermission(Manifest.permission.READ_CALENDAR))
public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks");

7. 重寫函數(shù)注解

如果API允許重寫某個函數(shù),但同時(shí)要求重寫的函數(shù)調(diào)用被重寫函數(shù)則可以使用@CallSuper注解.

@CallSuper
public static int testCallSuper() {
    return 0;
}

8. 返回值注解

需要調(diào)用者對返回值進(jìn)行某些處理,可以使用@CheckResult 回調(diào). suggest 會是提示內(nèi)容.

@CheckResult(suggest = "檢查一下返回值唄")
public static int testReturn(){
    return 12;
}
public static void testCheck(){
    int x = testReturn();
}
返回值注解

9. 單元測試 @VisibaleForTesting

使某些變量在單元測試中可見.

10. @Keep

用來標(biāo)記在混淆時(shí)不需要混淆的方法.

參考 : Android 高級進(jìn)階

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末世杀,一起剝皮案震驚了整個濱河市恼策,隨后出現(xiàn)的幾起案子泥从,更是在濱河造成了極大的恐慌丁逝,老刑警劉巖嚼鹉,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菱父,死亡現(xiàn)場離奇詭異挣饥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)地回,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門扁远,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俊鱼,“玉大人,你說我怎么就攤上這事畅买〔⑾校” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵皮获,是天一觀的道長焙蚓。 經(jīng)常有香客問我,道長洒宝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任萌京,我火速辦了婚禮雁歌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘知残。我一直安慰自己靠瞎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布求妹。 她就那樣靜靜地躺著乏盐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪制恍。 梳的紋絲不亂的頭發(fā)上父能,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機(jī)與錄音净神,去河邊找鬼何吝。 笑死,一個胖子當(dāng)著我的面吹牛鹃唯,可吹牛的內(nèi)容都是我干的爱榕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼坡慌,長吁一口氣:“原來是場噩夢啊……” “哼黔酥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起洪橘,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤跪者,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后梨树,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坑夯,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年抡四,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柜蜈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仗谆。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖淑履,靈堂內(nèi)的尸體忽然破棺而出隶垮,到底是詐尸還是另有隱情,我是刑警寧澤秘噪,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布狸吞,位于F島的核電站,受9級特大地震影響指煎,放射性物質(zhì)發(fā)生泄漏蹋偏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一至壤、第九天 我趴在偏房一處隱蔽的房頂上張望威始。 院中可真熱鬧,春花似錦像街、人聲如沸黎棠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脓斩。三九已至,卻和暖如春畴栖,著一層夾襖步出監(jiān)牢的瞬間随静,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工驶臊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挪挤,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓关翎,卻偏偏與公主長得像扛门,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纵寝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容