Support Annotation Library 使用详解

Support Annotation Library 是提供了一系列元注解,用来帮助开发者在编译期间发现可能存在的BUG.

1. Nullness 注解

此类注解包含 :

  • @Nullable 作用于函数参数和返回值,标记参数或者返回值可以为空.
  • @NonNull 作用于函数参数和返回值,标记参数或者返回值不可以为空.

Android Studio 会自动提示注解错误.

注解错误

2. 资源类型注解

在Android中资源通常用整形值表示,保存在R文件中. 这样存在的问题就是如果一个需要使用Layout资源的地方传入了一个String类型的资源编译期间也不会报错,只有在运行到相应代码时才会发现错误. 使用资源型注解就可以解决这个问题.

注解符号 标记类型
@AnimatorRes android.R.animator
@AnimRes android.R.anim
@AnyRes 标记整形值是任意一种资源
@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 表示复数字符串.
@RawRes android.R.raw
@StringRes android.R.string
@StyleableRes android.R.styleable
@StyleRes android.R.style
@TransitionRes 标记 transition类型
@XmlRes android.R.xml

3. 类型定义注解

在Android开发中,整数值不仅用来代表资源值,也经常用来代表枚举值. 使用@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标志位,来识别函数参数或者返回值是否符合某一种模式.

// 定义范围
@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 : 标记运行在UI线程.
  • @MainThread : 运行在主线程,一个应用只有一个主线程,主线程也是@UIThread线程,通常情况下我们可以使用@MainThread 来注解生命周期相关的函数,使用@UiThread 来注解视图相关的函数,一般情况下两者可以互换.
  • @WorkerThread : 标记运行在后台线程.
  • @BinderThread : 标记运行在Binder线程中.
@UiThread
public void testUiThread(){
    Log.d(TAG,"运行在UI线程中");
}
@MainThread
public void testMainThread(){
    Log.d(TAG, "运行在主线程");
}
@WorkerThread
public void testWorkerThread(){
    Log.d(TAG, "运行在后台线程");
}
@BinderThread
public void testBinderThread(){
    Log.d(TAG, "运行在Binder线程");
}

5. 值范围注解

当函数取值是一定范围时,我们可以使用值范围注解来防止调用这传入错误参数.

  • @Size : 对于集合、数组和字符串之类的参数,开使用@Size注解来表示这些参数的大小.

    • @Size(min=1) // 集合币可以为空
    • @Size(max=4) // 字符串最大字符个数是4.
    • @Size(2) // 数组元素两个.
    • @Size(multiple=2) //数组大小是2 的倍数.
// 数组不能为空
public void testRange1(@Size(min = 1) final byte[] bbs){
}
// 数组长度大4
public void testRange2(@Size(max = 4) final byte[] bbs){
}
// 两个字符
public void testRange3(@Size(2) String string){
}
// 长度是 2 的倍数.
public void testRange4(@Size(multiple = 2) String string){
}
  • @IntRange : 参数可以是 int 或者 long
// 0-255
public void testRange5(@IntRange(from = 0,to = 255) int alpha){
}
  • @FloatRange : 参数是float或者double
// 0.0-255.0
public void testRange6(@FloatRange(from = 0.0,to = 255.0) float alpha){
}

6. 权限注解

Android 应用在使用某些系统功能时,需要在AndroidManifest.xml中声明权限,否则运行会报错. 使用权限注解@RequiresPermission 可以帮助我们在编译时找出错误.

  • 需要声明一个权限
// 调用此方法需要声明权限.
@RequiresPermission(Manifest.permission.SET_WALLPAPER)
public void testPermissionAnnotation() {
}
  • 需要声明集合中的至少一个权限
// 调用此方法需要声明下面任何一个权限.
@RequiresPermission(anyOf = {
        Manifest.permission.ACCESS_COARSE_LOCATION,
        Manifest.permission.ACCESS_FINE_LOCATION})
public void testPermission2(){}
  • 需要声明集合中的所有权限
// 调用此方法需要声明下面所有的权限.
@RequiresPermission(allOf = {
        Manifest.permission.ACCESS_COARSE_LOCATION,
        Manifest.permission.ACCESS_FINE_LOCATION})
public void testPermission3(){}
  • Intent 调用所需权限,可以在Intent的ACTION字符串定义处添加注解
// Intent 的这个Action需要使用如下权限
@RequiresPermission(Manifest.permission.EXPAND_STATUS_BAR)
public static final String ACTION_MY = "custom_action";
  • ContentProvider 同时需要读写
// 对于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. 重写函数注解

如果API允许重写某个函数,但同时要求重写的函数调用被重写函数则可以使用@CallSuper注解.

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

8. 返回值注解

需要调用者对返回值进行某些处理,可以使用@CheckResult 回调. suggest 会是提示内容.

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

9. 单元测试 @VisibaleForTesting

使某些变量在单元测试中可见.

10. @Keep

用来标记在混淆时不需要混淆的方法.

参考 : Android 高级进阶

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容