注解实践


前言

成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。

本文会提及Android中常用注解的用法,下面先提及java的4个元注解(元注解即是注解的注解)。

注解是什么
注解是一种元数据,即描述数据的数据。
它的作用:
1.检测代码是否满足特定的要求。
2.使代码具有可读性。
3.降低项目的耦合度。
4.自动生成一些模板代码。
1、@Target

该注解支持六种元素类型支持,作用是定义注解的作用目标。

ElementType.TYPE(Class, interface, enum)

ElementType.FIELD(Instance varaible)

ElementType.METHOD

ElementType.PARAMETER

ElementType.CONSTRACTOR

ElementType.LOCAL_VARAIBLE

ElementType.ANNOTATION_TYPE

ElementType.PACKAGE

(Api26以上)

ElementType.TYPE_PARAMETER

ElementType.TYPE_USE
2、@Retention

该注解支持三种保留策略,作用是定义注解的保留策略。

RetentionPolicy.SOURCE(定义只保留在源码中)

RetentionPolicy.CLASS(定义注解一直保留到Class字节码文件中)

RetentionPolicy.RUNTIME(定义注解一直保留到运行时期,通过反射获取得到)
3、@Document

该注解作用是将其定义的注解保留在javadoc文档中。

4、@Inherited

该注解作用是允许子类能够继承父类中的该注解。注意:该注解仅限于声明类

接下来是其他的一些support-annotation

Nullness annotation

1、@Nullable

该注解作用指示许方法返回值、参数和变量为空

2、@NonNull

该注解作用是指示方法返回值、参数和变量不为空

Resource annotation

1、@StringRes

表明是一个字符串资源

2、@DrawableRes

表明是一个图片资源

3、@DimenRes

表明是一个尺寸资源

4、@InterpolatorRes

表明是一个插值器资源

5、@ColorRes和@ColorInt

表明是一个颜色资源,建议用@ColorInt,因为@ColorRes不能把颜色整形(RRGGBB或者AARRGGBB)识别为颜色资源)。

6、@AnyRes

表明是一个任意类型的R资源

Thread annotation

1、@MainThread和@UiThread

表明是在主线程,正常情况下,两者相等,但是系统应用在不同线程上有多个视图时,两者不相等,此时,@UiThread标注与应用的视图层次结构相关联的方法,使用@MainThread仅用于标注与应用生命周期相关联的方法。

2、@WorkerThread

表明是在工作线程

3、@BinderThread

表明是在Binder线程

4、@AnyThread

表明是在任意线程

Value constraint annotation

1、@IntRange

指定一个整形范围的值

@IntRange(from = 0,to = 255)
2、@FloatRange

指定一个浮点型范围的值

@FloatRange(from = 0.0,to = 1.0)
3、@Size

检查集合和数组的大小或者字符串的长度

@Size(1)可以作为一个非空判断

@Size(3)指定大小或长度为3

@Size(min = 1)指定最小值为1

@Size(max = 10)指定最大值为10

@Size(mutiple = 2)指定大小或长度为2的倍数

Permission annotation

@RequiresPermission

验证方法调用方的权限

检查有效权限列表中是否有某个权限用anyOf属性,
检查是否有一组有效权限用allOf属性。

此外,它还可定义

Intent权限

@RequiresPermission(android.Manifest.permission.BLUETOOTH)
public static final String ACTION_REQUEST_DISCOVERABLE =
“android.bluetooth.adapter.action.REQUEST_DISCOVERABLE”;

对于单独读写权限的内容提供者权限

@RequiresPermission.Read(@RequiresPermission(READ_HISTORY_BOOKMARKS))
@RequiresPermission.Write(@RequiresPermission(WRITE_HISTORY_BOOKMARKS))
public static final Uri BOOKMARKS_URI = Uri.parse(“content://browser/bookmarks”);

间接权限

对于权限依赖于方法参数所需的权限,可使用@RequiresPermission对参数使用间接权限。

startActivity(@RequiresPermission Intent intent)

对传入的new Intent(Intent.Action_CALL)会在使用该startActivity时进行间接权限检测,检测得权限为Manifest.permission.CALL_PHONE。

此外,@RequiresPermission可以替换为@RequiresPermission.Read或者@RequiresPermission.Write,但是不能与其共存。

Retured value annotation

@CheckResult

验证方法实际使用的是方法的结果还是返回值。

此外还可指定额外的建议方法

@CheckResult(suggest="#enforcePermission(String,int,int,String)")
public abstart int requirePermission(...)

CallSuper annotation

用于验证子类方法是否会实现基类方法的超类实现

@CallSuper
public void onCreate(Bundle saveInstanceState)

TypeDef annotation

@IntDef

用于强制使用已定义的整形

@Retention(SOURCE)
  @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
  public @interface NavigationMode {}
  public static final int NAVIGATION_MODE_STANDARD = 0;
  public static final int NAVIGATION_MODE_LIST = 1;
  public static final int NAVIGATION_MODE_TABS = 2;
  ...
  public abstract void setNavigationMode(@NavigationMode int mode);
  @NavigationMode
  public abstract int getNavigationMode();
@IntRange

用于强制使用已定义的整形范围

@IntRange(from=0,to=255)
public int getAlpha() {
      ...
}
@StringDef

用于强制使用已定义的字符串

@Retention(SOURCE)
  @StringDef({
     POWER_SERVICE,
     WINDOW_SERVICE,
     LAYOUT_INFLATER_SERVICE
  })
  public @interface ServiceName {}
  public static final String POWER_SERVICE = "power";
  public static final String WINDOW_SERVICE = "window";
  public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
  ...
  public abstract Object getSystemService(@ServiceName String name);

还可以运行将常量与标志相结合

在@StringDef(flag=true,{…})多添加一个标志进行综合判断

代码可访问型注解

使用 @VisibleForTesting 和 @Keep 注解可以表示方法、类或字段的可访问性。

@VisibleForTesting 注解指示一个代码块的可见性是否高于让代码变得可测试所需要的水平。

@Keep 指出一个方法在被混淆的时候应该被保留。
该注解可以确保如果在构建时缩减代码,标注的元素不会移除。它一般会添加到通过反射访问的方法和类中,以阻止编译器将代码视为未使用。

赞赏

如果这个库对您有很大帮助,您愿意支持这个项目的进一步开发和这个项目的持续维护。你可以扫描下面的二维码,让我喝一杯咖啡或啤酒。非常感谢您的捐赠。谢谢!




Contanct Me

● 微信:

欢迎关注我的微信:bcce5360

● 微信群:

微信群如果不能扫码加入,麻烦大家想进微信群的朋友们,加我微信拉你进群。



● QQ群:

2千人QQ群,Awesome-Android学习交流群,QQ群号:959936182, 欢迎大家加入~

About me

很感谢您阅读这篇文章,希望您能将它分享给您的朋友或技术群,这对我意义重大。

希望我们能成为朋友,在 Github掘金上一起分享知识。

坚持原创技术分享,您的支持将鼓励我继续创作!