Android 經(jīng)典筆記之六:Annotation注釋使用介紹

Annotation注釋使用介紹
目錄介紹
1.Annotation庫(kù)的簡(jiǎn)單介紹
2.@Nullable和@NonNull
3.資源類型注釋
4.類型定義注釋
5.線程注釋
6.RGB顏色紙注釋
7.值范圍注釋
8.權(quán)限注釋
9.重寫函數(shù)注釋
10.返回值注釋
11.@Keep注釋
12.@SuppressWarnings注解
13.其他
14.后續(xù)

好消息

  • 博客筆記大匯總【16年3月到至今】按咒,包括Java基礎(chǔ)及深入知識(shí)點(diǎn)尼变,Android技術(shù)博客,Python學(xué)習(xí)筆記等等道逗,還包括平時(shí)開(kāi)發(fā)中遇到的bug匯總,當(dāng)然也在工作之余收集了大量的面試題献烦,長(zhǎng)期更新維護(hù)并且修正滓窍,持續(xù)完善……開(kāi)源的文件是markdown格式的!同時(shí)也開(kāi)源了生活博客巩那,從12年起吏夯,積累共計(jì)47篇[近20萬(wàn)字],轉(zhuǎn)載請(qǐng)注明出處拢操,謝謝锦亦!
  • 鏈接地址:https://github.com/yangchong211/YCBlogs
  • 如果覺(jué)得好,可以star一下令境,謝謝杠园!當(dāng)然也歡迎提出建議,萬(wàn)事起于忽微舔庶,量變引起質(zhì)變抛蚁!

1.Annotation庫(kù)的簡(jiǎn)單介紹

  • 包含一系列有用元注釋,幫助開(kāi)發(fā)者在編譯期間發(fā)現(xiàn)可能存在的bug
    是屬于Support Lib其中之一惕橙,獨(dú)立jar包
  • 通過(guò)注釋來(lái)完善自身代碼質(zhì)量
  • 官方文檔:
    AndroidAnnotations是一個(gè)能讓你進(jìn)行快速開(kāi)發(fā)的開(kāi)源框架,它讓你關(guān)注真正重要的地方,它可以簡(jiǎn)化你的代碼,并且有利于你后期的維護(hù)
  • 庫(kù)的特點(diǎn)
依賴注入(Dependency injection):支持view, extras, system service, resource等等
簡(jiǎn)單的線程模型(Simplified threading model):進(jìn)行方法注解以讓該方法在UI線程或后臺(tái)線程進(jìn)行執(zhí)行
事件綁定(Event binding):進(jìn)行方法注解以讓方法執(zhí)行view的時(shí)間而不用再添加一些監(jiān)聽(tīng)
REST client:創(chuàng)建一個(gè)接口,AndroidAnnotations用來(lái)實(shí)現(xiàn)
沒(méi)有神秘感(No magic):AndroidAnnotations在編譯時(shí)會(huì)產(chǎn)生一個(gè)子類,你可以查看子類中的代碼來(lái)知道它是如何工作的.
編譯檢測(cè):提供的多種注解,用于檢測(cè)代碼編譯時(shí)可能存在的異常,并給開(kāi)發(fā)者相關(guān)提示,提高代碼質(zhì)量
AndroidAnnotations來(lái)實(shí)現(xiàn)這些美好的功能,只需要不到150kb的大小

相關(guān)文檔給出說(shuō)明:androidannotations.org
這篇文檔給出了案例瞧甩,很好地說(shuō)明了注釋前后代碼的區(qū)別

2.@Nullable 和 @NonNull

  • 說(shuō)明:
    檢測(cè)參數(shù)或者方法返回值是否可以為null,這是該框架中最常用也是最基礎(chǔ)的注解之一了,使用了這兩個(gè)注解,在Android Studio中,如果出現(xiàn)代碼不安全的情況下,會(huì)給出智能提示
@Nullable作用于函數(shù)參數(shù)或者返回值,標(biāo)記參數(shù)或者返回值可以為空
@NonNull作用于函數(shù)參數(shù)或者返回值弥鹦,標(biāo)記參數(shù)或者返回值不可以為空
@NonNull使用舉例【**千萬(wàn)別忽視黃色警告-----這個(gè)淡黃色警告實(shí)際開(kāi)發(fā)中很容易忽視**】
  • 未加注釋:


    Image.png
  • 添加注釋:


    Image.png
  • 結(jié)論:可以看到加上的@NonNull注解后,Android Studio會(huì)自動(dòng)檢測(cè)不安全的代碼并給出友好提示,提示開(kāi)發(fā)者進(jìn)行修改

  • @Nullable 使用舉例


    Image.png
  • 結(jié)論:將@Nullable作用在方法上,這樣方法的返回值是允許為null的,但是可能會(huì)導(dǎo)致某些情況下的crash;

3.資源類型注釋

  • 在我們平時(shí)開(kāi)發(fā)中我們肯定會(huì)經(jīng)常用到引用一些資源,比如圖片資源及字符串資源或者顏色值資源,因?yàn)檫@些資源的類型都是int值,所以有時(shí)候我們?cè)诮oTextView設(shè)置字符串資源時(shí)也有可能引用了圖片資源ID,就會(huì)導(dǎo)致有問(wèn)題,比如會(huì)出現(xiàn)以下異常:
    android.content.res.Resources$NotFoundException: String resource ID #0x3039

  • 資源通常是以整型值表示的肚逸,保存在R.Java文章中。如果傳入資源值不對(duì)彬坏,那么編譯器不會(huì)報(bào)錯(cuò)朦促,但是運(yùn)行期會(huì)報(bào)錯(cuò)。而注解可以避免這個(gè)問(wèn)題栓始。
    資源類型注解主要都有哪些务冕?

@StringRes : 表示參數(shù)、變量或者函數(shù)返回值應(yīng)該是一個(gè)字符串類型的資源
@ColorInt : 表示參數(shù)幻赚、變量或者函數(shù)返回值應(yīng)該是一個(gè)顏色值而不是顏色資源引用禀忆,例如應(yīng)該是一個(gè) AARRGGBB 的整數(shù)值。
@ColorRes : 表示參數(shù)落恼、變量或者函數(shù)返回值應(yīng)該是一個(gè) color 類型的資源箩退,而不是顏色值。注意和 ColorInt 區(qū)別
@AnimRes : 表示參數(shù)佳谦、變量或者函數(shù)返回值應(yīng)該是一個(gè) Anim 類型的資源
@DrawableRes : 表示參數(shù)戴涝、變量或者函數(shù)返回值應(yīng)該是一個(gè) drawable 類型的資源
@DimenRes : 表示參數(shù)、變量或者函數(shù)返回值應(yīng)該是一個(gè) dimension 類型的資源
  • 舉例子: 這里定義了一個(gè)方法,方法中只接受@StringRes注解的int引用
    沒(méi)有添加注釋前


    Image.png

    添加注釋后


    Image.png

    結(jié)論:添加注釋可以在編譯器就找到錯(cuò)誤

5.線程注釋

  • 線程注解主要是用于檢測(cè)一個(gè)函數(shù)是否在指定類型的線程中執(zhí)行
  • 類型
@UiThread:標(biāo)記運(yùn)行在UI線程,一個(gè)UI線程是Activity運(yùn)行所在的主窗口喊括,對(duì)于一個(gè)應(yīng)用而言,可能存在多個(gè)UI線程矢棚。每個(gè)UI線程對(duì)應(yīng)不同的主窗口郑什。
@MainThread:標(biāo)記運(yùn)行在主線程,一個(gè)應(yīng)用只有一個(gè)主線程蒲肋,主線程也是@UiThread線程蘑拯。通常情況下,我們使用@MainThread來(lái)注解生命周期相關(guān)函數(shù)兜粘,使用@UiThread來(lái)注解視圖相關(guān)函數(shù)申窘,一般情況下@MianThread和@UiThraed是可以互換的。
@WorkerThread:標(biāo)記運(yùn)行在后臺(tái)運(yùn)行線程孔轴。
@BinderThread:標(biāo)記運(yùn)行在Binder線程
  • 舉例子
public void threadtest(){ 
    new Thread(new TimerTask() { 
        @Override 
        public void run() { 
            setTest(); 
        } 
    }).start(); 
} 

@UiThread 
public void setTest(){ 
    test.setText("測(cè)試"); 
}
**那么上面會(huì)報(bào)錯(cuò)剃法。提示:不做線程切換,只起到提示作用路鹰!**

6.RGB顏色紙注釋

  • 在資源類型注解中我們使用@ColorRes來(lái)標(biāo)記參數(shù)類型需要傳入顏色類型的id贷洲,而使用@ColorInt注解是標(biāo)記參數(shù)類型需要傳入RGB或者ARGB顏色值的整型值。
  • 舉例子晋柱,閱讀TextView源代碼中的setTextColor方法
Image.png

7.值范圍注釋

  • 當(dāng)函數(shù)參數(shù)的取值在一定范圍時(shí)优构,可以使用注解來(lái)防止調(diào)用者傳入錯(cuò)誤的參數(shù),主要注解有三種雁竞。
  • @Size
@Size:對(duì)于類似數(shù)組钦椭、集合和字符串之類的參數(shù),我們可以使用@Size注解來(lái)表示這些參數(shù)的大小碑诉。
用法:
@Size(min=1)//可以表示集合不可以為空
@Size(max=23)//可以表示字符串最大字符個(gè)數(shù)為23
@Size(2)//表示數(shù)組元素個(gè)數(shù)為2個(gè)
@Size(multiple=2)//可以表示數(shù)組大小是2的倍數(shù)
  • @IntRange:參數(shù)類型是int或者long彪腔,用法如下

    public void setInt(@intRange(from=0,to=255)){...}

  • @FloatRange:參數(shù)類型是float或者double,用法如下

    public void setFloat(@FloatRange(from=0.0,to=1.0)){...}

  • 舉個(gè)例子

  • @FloatRange 用法

Image.png
  • @Size用法
Image.png
  • 數(shù)組只能有2個(gè)元素: @Size(2)
Image.png

8.權(quán)限注釋

  • Android應(yīng)用在使用某些系統(tǒng)功能時(shí)联贩,需要在AndroidManifest,xml中聲明權(quán)限漫仆,否則在運(yùn)行時(shí)就會(huì)提示缺失對(duì)應(yīng)的權(quán)限,為了在編譯時(shí)及時(shí)發(fā)現(xiàn)權(quán)限的缺失泪幌,我們可以使用@RequiresPermission注解盲厌。
  • 如果需要一個(gè)權(quán)限則加注解。
     @RequiresPermission(Manifest.permission.SET_WALLPAPER)
  • 如果需要一個(gè)集合至少一個(gè)權(quán)限祸泪,那么就加注解吗浩。
     @RequiresPermission(anyOf = {Manifest.permission.SET_WALLPAPER,Manifest.permission.CAMERA})
  • 如果同時(shí)需要多個(gè)權(quán)限,那么就加注解没隘。
     @RequiresPermission(allOf = {Manifest.permission.SET_WALLPAPER,Manifest.permission.CAMERA})
  • 對(duì)于Intent調(diào)用所需權(quán)限的ACTION字符串定義處添加注解懂扼。
     @RequiresPermission(android.Manifest.permission.BLUETOOTH)
     String ACTION_REQUEST_DISCOVERRAVLE = "android.bluetooth.adapter.REQUEST_DISCOVERRAVLE";
  • 對(duì)于ContentProvider所需權(quán)限,可能有讀和寫兩個(gè)操作。對(duì)應(yīng)不同的權(quán)限阀湿。
@RequiresPermission.Read(@RequestPermission(READ_HISTORY_BOOLMARKS))
@RequiresPermission.Write(@RequestPermission(WRITE_HISTORY_BOOLMARKS))
public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks);

9.重寫函數(shù)注釋

  • 如果API允許重寫某個(gè)函數(shù)赶熟,但是要求在重寫該函數(shù)時(shí)需要調(diào)用super父類的函數(shù)。
    可以加注解@CallSuper來(lái)提示開(kāi)發(fā)者陷嘴。若是重寫不調(diào)用super就會(huì)報(bào)錯(cuò)
    舉例子
Image.png

10.返回值注釋

  • 該注解是為了檢測(cè)方法返回值是否是需要使用的,如果沒(méi)有被使用,則AndroidStudio會(huì)給出警告提示
    @CheckResult使用案例

  • 添加注釋:

Image.png

11.@Keep注釋

  • @keep是用來(lái)標(biāo)記在Proguard混淆過(guò)程中不需要混淆的類或者方法映砖。在混淆時(shí)一些不需要混淆的會(huì)使用
    -keep class com.foo.bar{public static <method>}

  • 有了@Keep之后,就可以在編碼時(shí)標(biāo)注出一些不需要混淆的類或者方法

12.@SuppressWarnings注解

  • 這個(gè)注解在源碼里是隨處可見(jiàn)灾挨,其實(shí)它的用法很簡(jiǎn)單邑退,就是對(duì)一些警告信息的過(guò)濾。
    源代碼
Image.png
  • 這個(gè)注解是可以使用在屬性劳澄、方法地技、構(gòu)造方法、變量等等秒拔。那么它的參數(shù)就是一個(gè)字符串?dāng)?shù)組莫矗。可以單個(gè)砂缩,可以多個(gè)趣苏。
    示例
@SuppressWarnings("unchecked")
告訴編譯器忽略 unchecked 警告信息,如使用List梯轻,ArrayList等未進(jìn)行參數(shù)化產(chǎn)生的警告信息食磕。
@SuppressWarnings("serial")
如果編譯器出現(xiàn)這樣的警告信息:The serializable class WmailCalendar does not declare a static final serialVersionUID field of type long使用這個(gè)注釋將警告信息去掉。
@SuppressWarnings("deprecation")
如果使用了使用@Deprecated注釋的方法喳挑,編譯器將出現(xiàn)警告信息彬伦。使用這個(gè)注釋將警告信息去掉。
@SuppressWarnings("unchecked", "deprecation")
告訴編譯器同時(shí)忽略u(píng)nchecked和deprecation的警告信息伊诵。
@SuppressWarnings(value={"unchecked", "deprecation"})
等同于@SuppressWarnings("unchecked", "deprecation")

13.其他

@EActivity单绑、@ViewById、@Click
這三個(gè)注解應(yīng)該是對(duì)我們的代碼簡(jiǎn)潔性最有幫助的
@EActivity : 后面需要跟上一個(gè)layout id,來(lái)標(biāo)示該Activity所加載的xml布局,這樣原來(lái)的onCreate()方法就不用寫了;
@ViewById : 與findViewById作用一致,而且@ViewById后面可以不寫控件id,前提是控件變量名要與控件id一致
@Click : 也就是控件的點(diǎn)擊事件,而且如果控件ID與方法名一致,后面就不用寫控件ID了. 該注解可以單獨(dú)寫,也可以對(duì)多個(gè)Button合并寫

代碼案例

//這里加注解就可以不寫onCreate方法 
@EActivity(R.layout.activity_test_annotation) 
public class TestAnnotation extends AppCompatActivity { 

    @ViewById(R.id.tv_name)//如果變量名和控件ID一致,后面就不用寫id 
    TextView tv_name; 

    @Click(R.id.showName)//如果控件ID與方法名一致,后面就不用寫id 
    public void showName(){ 
        Toast.makeText(this,tv_name.getText(),Toast.LENGTH_SHORT).show(); 
    } 
}   

14.后續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笛坦,一起剝皮案震驚了整個(gè)濱河市区转,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌版扩,老刑警劉巖废离,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異礁芦,居然都是意外死亡蜻韭,警方通過(guò)查閱死者的電腦和手機(jī)悼尾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肖方,“玉大人闺魏,你說(shuō)我怎么就攤上這事「┗” “怎么了舷胜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)活翩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)翻伺,這世上最難降的妖魔是什么材泄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮吨岭,結(jié)果婚禮上拉宗,老公的妹妹穿的比我還像新娘。我一直安慰自己辣辫,他們只是感情好旦事,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著急灭,像睡著了一般姐浮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上葬馋,一...
    開(kāi)封第一講書(shū)人閱讀 52,696評(píng)論 1 312
  • 那天卖鲤,我揣著相機(jī)與錄音,去河邊找鬼畴嘶。 笑死蛋逾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窗悯。 我是一名探鬼主播区匣,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蒋院!你這毒婦竟也來(lái)了亏钩?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤欺旧,失蹤者是張志新(化名)和其女友劉穎铸屉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體切端,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡彻坛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昌屉。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钙蒙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出间驮,到底是詐尸還是另有隱情躬厌,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布竞帽,位于F島的核電站扛施,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏屹篓。R本人自食惡果不足惜疙渣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望堆巧。 院中可真熱鬧妄荔,春花似錦、人聲如沸谍肤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)荒揣。三九已至篷角,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間系任,已是汗流浹背内地。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赋除,地道東北人阱缓。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像举农,于是被迫代替她去往敵國(guó)和親荆针。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,323評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理颁糟,服務(wù)發(fā)現(xiàn)航背,斷路器,智...
    卡卡羅2017閱讀 134,715評(píng)論 18 139
  • 前言 人生苦多棱貌,快來(lái) Kotlin 玖媚,快速學(xué)習(xí)Kotlin! 什么是Kotlin婚脱? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,218評(píng)論 9 118
  • 從昨天開(kāi)始今魔,小R先森就開(kāi)始了不舒服勺像,先是嘔吐,噴射性嘔吐错森,3次吟宦,直到晚上才一次臭臭,到了今天涩维,沒(méi)有嘔吐殃姓,卻拉了9...
    小sev7en閱讀 357評(píng)論 0 1
  • 人生,不在于活了多長(zhǎng)時(shí)間瓦阐,而在于記住了多少時(shí)間呀蜗侈! 姑媽在堂屋和鄰居們?cè)谡f(shuō)話,堂屋門檻旁邊有一條毛毛蟲(chóng)睡蟋,一個(gè)人說(shuō)踏幻,...
    藤木同學(xué)閱讀 168評(píng)論 0 0