Android support-annotations 注解使用詳解

Android 注解庫(kù)依賴

Android-support-library 引入了新的注解庫(kù)癞谒,包含很多有用的元注解啊掏,可以用來修飾代碼提示梗搅。如果使用了 v4禾唁、v7效览、appcompat 的庫(kù),則內(nèi)部已經(jīng)引用過下面的依賴荡短。

implementation 'com.android.support:support-annotations:28.0.0'

注解庫(kù)元注解說明

依賴了上述 Android 注解庫(kù)后丐枉,就可以使用下面的元注解了。

資源注解

@StringRes

用于指出一個(gè) integer 的參數(shù)掘托、成員變量或方法返回值是一個(gè) string 資源的引用瘦锹。示例:

//成員變量
@StringRes
int userId;

//參數(shù)
public void setUserId(@StringRes int userId) {
}

//方法返回值
public @StringRes int getUserId(){
//  return R.string.app_name;
    return userId;
}

舉個(gè)例子,當(dāng) @StringRes 用作參數(shù)限定時(shí)闪盔,參數(shù)為 int 類型沼本,正確情況下只能傳 R.string.xx,如下圖:

@StringRes

如果直接傳 int 數(shù)值锭沟,編譯器會(huì)發(fā)出警告以提醒開發(fā)者注意編碼的正確性抽兆。注意:即使編譯器發(fā)出警告,仍然能忽略警告直接編譯運(yùn)行項(xiàng)目族淮。

下面的代碼是來自另一注解庫(kù)的寫法辫红, android-support-annotations 并不支持,不要弄混祝辣。

@StringRes(R.string.text_name)
String text;

來自依賴庫(kù):

annotationProcessor 'org.androidannotations:androidannotations:4.4.0'
implementation 'org.androidannotations:androidannotations-api:4.4.0'

相似的贴妻,資源注解還支持以下資源類型:

@AnimatorRes、@AnimRes蝙斜、@AnyRes名惩、@ArrayRes、@AttrRes孕荠、@BoolRes娩鹉、@ColorRes、@DimenRes稚伍、@DrawableRes弯予、@FractionRes、@IdRes个曙、@IntegerRes锈嫩、@InterpolatorRes、@LayoutRes垦搬、@MenuRes呼寸、@PluralsRes、@RawRes猴贰、@StyleableRes对雪、@StyleRes、@TransitionRes糟趾、@XmlRes

顏色注解

@ColorInt

用于指出被注解的元素是一個(gè) int 顏色值慌植,表示的是 AARRGGBB。

線程注解

指定方法運(yùn)行在特定線程中义郑。

@MainThread:被注解的方法應(yīng)該只在主線程中被調(diào)用蝶柿。
@WorkerThread:被注解的方法應(yīng)該只在工作線程中被調(diào)用。
@UiThread:被注解的方法應(yīng)該只在 UI 線程中被調(diào)用非驮。

但是實(shí)際測(cè)試發(fā)現(xiàn)對(duì)于 @MainThread交汤、@UiThread 倆個(gè)注解 ide 沒有給出很好的警號(hào),下面是圖示劫笙,有知道原因的同學(xué)歡迎留言芙扎。

方法定義:

    @MainThread
    public void testMainThread(){

    }

    @UiThread
    public void testUiThread(){

    }

    @WorkerThread
    public void testWorkerThread(){

    }

測(cè)試結(jié)果:

@xxxThread

空注解

@Nullable 用來標(biāo)記參數(shù)或返回值可以為 null;
@NonNull 用來標(biāo)記參數(shù)或返回值不能為 null填大;


    @NonNull
    String nullString = "test";

    public void testNull(@Nullable String key){

    }

    public @Nullable String testNull(){
        return null;
    }
    
    public void testNonNull(@NonNull String key){

    }

    public @NonNull String testNonNull(){
        return "test";
    }

當(dāng)出現(xiàn)錯(cuò)誤使用時(shí)戒洼,會(huì)出現(xiàn)下面的黃色背景警告:

@NonNull

但是需要注意,即使上述示例中出現(xiàn)了警告允华,也仍然能編譯通過圈浇,所以 @Nullable、@NonNull 并非是安全的靴寂,它僅是編碼時(shí)的一種提示磷蜀。

樣式注解

@IntDef @StringDef

相當(dāng)于替換枚舉。

@IntDef({SpecType.TYPE_ONE, SpecType.TYPE_TWO, SpecType.TYPE_THREE})
@Retention(RetentionPolicy.SOURCE)
public @interface SpecType {
    int TYPE_ONE = 1;
    int TYPE_TWO = 2;
    int TYPE_THREE = 3;
}

//示例
public void setSpecType(@SpecType int type) {
}

同樣百炬,錯(cuò)誤情況下褐隆,存在下劃線警告仍然能編譯通過,注解僅僅用來提示開發(fā)者編碼的正確性剖踊,并非絕對(duì)安全庶弃。

值域注解

@Size @IntRange @FloatRange

指定元素的數(shù)值范圍。

使用:

    public void setValue(@IntRange(from = 0, to = 10) int v) {

    }

    public void setSize(@Size(min = 1) int v) {
        //int 最小為 1
    }

    public void setSize(@Size(max = 5) String s) {
        //string 的長(zhǎng)度最大為 5
    }

    public void setSize(@Size(min = 1) List l) {
        //集合至少有一個(gè)元素
    }

    public void setSize(@Size(2) int[] arr) {
        //數(shù)組只能有倆個(gè)元素
    }

測(cè)試結(jié)果:

@xxxRange

測(cè)試發(fā)現(xiàn) @IntRange 中德澈,對(duì)于 int虫埂、集合,ide 沒有給出正確的警告(也可能是理解圃验、測(cè)試方式有誤掉伏?),有清楚原因的小伙伴歡迎留言澳窑。

權(quán)限注解

@RequiresPermission

聲明一個(gè)方法需要的權(quán)限斧散。

@RequiresPermission(Manifest.permission.INTERNET)
public void testPermission(){

}

當(dāng) AndroidManifest 沒有配置相應(yīng)權(quán)限時(shí)會(huì)下劃線警告。

重寫注解

@CallSuper

用于提示重寫的父類方法也必須調(diào)用摊聋。

使用:

public class Father {

    @CallSuper
    public void test(){

    }
}

測(cè)試結(jié)果:

@CallSuper

混淆注解

@Keep

保證代碼不被混淆

總結(jié)

注解有以下三種類型:

類型 效果 用途
RetentionPolicy.Source 源碼注解鸡捐,Java 編譯成 class 時(shí)注解被遺棄。 編碼時(shí)檢測(cè)麻裁,如 @Nullable
RetentionPolicy.CLASS 注解保留到 class 文件箍镜,但 JVM 加載 class 時(shí)遺棄源祈,是默認(rèn)生命周期。 編譯時(shí)處理色迂,如EventBus 3.0 編譯時(shí)注解
RetentionPolicy.RunTime 注解在運(yùn)行時(shí)仍然存在香缺。 動(dòng)態(tài)注解,如 EventBus 2.0歇僧,或枚舉替代

Android support-annotations 注解庫(kù)更多的作用是協(xié)調(diào)開發(fā)(即上述源碼注解或編譯時(shí)注解)图张,注解可以給予協(xié)作者一定的代碼提示,使用它制定開發(fā)規(guī)則诈悍,以提升協(xié)作開發(fā)下代碼的健壯性祸轮。另外需要注意的是,注解并非像 Java 強(qiáng)類型校驗(yàn)一樣安全侥钳,即使存在告警也能編譯通過并運(yùn)行适袜,所以兼容代碼仍然需要。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舷夺,一起剝皮案震驚了整個(gè)濱河市痪蝇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冕房,老刑警劉巖躏啰,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異耙册,居然都是意外死亡给僵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門详拙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帝际,“玉大人,你說我怎么就攤上這事饶辙《拙鳎” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵弃揽,是天一觀的道長(zhǎng)脯爪。 經(jīng)常有香客問我,道長(zhǎng)矿微,這世上最難降的妖魔是什么痕慢? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮涌矢,結(jié)果婚禮上掖举,老公的妹妹穿的比我還像新娘。我一直安慰自己娜庇,他們只是感情好塔次,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布方篮。 她就那樣靜靜地躺著,像睡著了一般励负。 火紅的嫁衣襯著肌膚如雪藕溅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天熄守,我揣著相機(jī)與錄音蜈垮,去河邊找鬼耗跛。 笑死裕照,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的调塌。 我是一名探鬼主播晋南,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼羔砾!你這毒婦竟也來了负间?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤姜凄,失蹤者是張志新(化名)和其女友劉穎政溃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體态秧,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡董虱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了申鱼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愤诱。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捐友,靈堂內(nèi)的尸體忽然破棺而出淫半,到底是詐尸還是另有隱情,我是刑警寧澤匣砖,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布科吭,位于F島的核電站,受9級(jí)特大地震影響猴鲫,放射性物質(zhì)發(fā)生泄漏砌溺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一变隔、第九天 我趴在偏房一處隱蔽的房頂上張望规伐。 院中可真熱鬧,春花似錦匣缘、人聲如沸猖闪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)培慌。三九已至豁陆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吵护,已是汗流浹背盒音。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馅而,地道東北人祥诽。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瓮恭,于是被迫代替她去往敵國(guó)和親雄坪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345