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,如下圖:
如果直接傳 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é)果:
空注解
@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)下面的黃色背景警告:
但是需要注意,即使上述示例中出現(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é)果:
測(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é)果:
混淆注解
@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)行适袜,所以兼容代碼仍然需要。