Android 注解库依赖

Android-support-library 引入了新的注解库,包含很多有用的元注解,可以用来修饰代码提示。如果使用了 v4、v7、appcompat 的库,则内部已经引用过下面的依赖。

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

注解库元注解说明

依赖了上述 Android 注解库后,就可以使用下面的元注解了。

资源注解

@StringRes

用于指出一个 integer 的参数、成员变量或方法返回值是一个 string 资源的引用。示例:

//成员变量@StringResint userId;//参数public void setUserId(@StringRes int userId) {}//方法返回值public @StringRes int getUserId(){//  return R.string.app_name;    return userId;}

举个例子,当 @StringRes 用作参数限定时,参数为 int 类型,正确情况下只能传 R.string.xx,如下图:

@StringRes

如果直接传 int 数值,编译器会发出警告以提醒开发者注意编码的正确性。注意:即使编译器发出警告,仍然能忽略警告直接编译运行项目。

下面的代码是来自另一注解库的写法, android-support-annotations 并不支持,不要弄混。

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

来自依赖库:

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

用于指出被注解的元素是一个 int 颜色值,表示的是 AARRGGBB。

线程注解

指定方法运行在特定线程中。

@MainThread:被注解的方法应该只在主线程中被调用。
@WorkerThread:被注解的方法应该只在工作线程中被调用。
@UiThread:被注解的方法应该只在 UI 线程中被调用。

但是实际测试发现对于 @MainThread、@UiThread 俩个注解 ide 没有给出很好的警号,下面是图示,有知道原因的同学欢迎留言。

方法定义:

    @MainThread    public void testMainThread(){    }    @UiThread    public void testUiThread(){    }    @WorkerThread    public void testWorkerThread(){    }

测试结果:

Android support-annotations 注解使用详解_第1张图片 @xxxThread

空注解

@Nullable 用来标记参数或返回值可以为 null;
@NonNull 用来标记参数或返回值不能为 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";    }

当出现错误使用时,会出现下面的黄色背景警告:

@NonNull

但是需要注意,即使上述示例中出现了警告,也仍然能编译通过,所以 @Nullable、@NonNull 并非是安全的,它仅是编码时的一种提示。

样式注解

@IntDef @StringDef

相当于替换枚举。

@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) {}

同样,错误情况下,存在下划线警告仍然能编译通过,注解仅仅用来提示开发者编码的正确性,并非绝对安全。

值域注解

@Size @IntRange @FloatRange

指定元素的数值范围。

使用:

    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 的长度最大为 5    }    public void setSize(@Size(min = 1) List l) {        //集合至少有一个元素    }    public void setSize(@Size(2) int[] arr) {        //数组只能有俩个元素    }

测试结果:

Android support-annotations 注解使用详解_第2张图片 @xxxRange

测试发现 @IntRange 中,对于 int、集合,ide 没有给出正确的警告(也可能是理解、测试方式有误?),有清楚原因的小伙伴欢迎留言。

权限注解

@RequiresPermission

声明一个方法需要的权限。

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

当 AndroidManifest 没有配置相应权限时会下划线警告。

重写注解

@CallSuper

用于提示重写的父类方法也必须调用。

使用:

public class Father {    @CallSuper    public void test(){    }}

测试结果:

Android support-annotations 注解使用详解_第3张图片 @CallSuper

混淆注解

@Keep

保证代码不被混淆

总结

注解有以下三种类型:

类型 效果 用途
RetentionPolicy.Source 源码注解,Java 编译成 class 时注解被遗弃。 编码时检测,如 @Nullable
RetentionPolicy.CLASS 注解保留到 class 文件,但 JVM 加载 class 时遗弃,是默认生命周期。 编译时处理,如EventBus 3.0 编译时注解
RetentionPolicy.RunTime 注解在运行时仍然存在。 动态注解,如 EventBus 2.0,或枚举替代

Android support-annotations 注解库更多的作用是协调开发(即上述源码注解或编译时注解),注解可以给予协作者一定的代码提示,使用它制定开发规则,以提升协作开发下代码的健壮性。另外需要注意的是,注解并非像 Java 强类型校验一样安全,即使存在告警也能编译通过并运行,所以兼容代码仍然需要。

更多相关文章

  1. 葵花宝典之普及篇 —— HD2 android 各种直刷方法
  2. android中实现view的更新UI有两组方法的问题
  3. Could not find SDK_Root\tools\adb.exe 的解决方法
  4. Android高手进阶教程(八)-------Android中两种设置全屏的方法!!!
  5. Android Studio导入.so库文件方法
  6. (转)Android 应用程序退出后不在运行列表中显示的方法
  7. Android Gallery控件使用方法详解

随机推荐

  1. 总说业务,到底业务常用的指标有哪些
  2. Python数据可视化:Python大佬有哪些?
  3. Mybatis-plus常用API全套教程,看完没有不
  4. Mybatis 配置 自定义缓存 ehcache
  5. C语言复习(二)
  6. ThingJS官方示例(十一):基于数据矢量及贴图u
  7. 用Python实现手机抓包,获取当当图书差评数
  8. Android(安卓)OTA升级包制作脚本详解(四,生
  9. 使用内存NewSQL数据平台来处理实时数据流
  10. 这款可视化工具也太好用了吧