Android开发Android技术知识Android开发

安卓注解使用详解

2018-11-08  本文已影响13人  我是黄教主啊

如何使用

如果你是使用的appcomat库,那么你就不需要导入注解库,因为appcompat库也依赖了它,如果不是,选中项目,按F4打开Project Structure对话框,首先在左边选中module,然后在右边选中Dependencies标签页,点击面板底部的+按钮,选择Library Dependency,com.android.support:support-annotations:27.1.1(第一个)就是我们需要的注解库了,导入进来。

注解使用介绍

注解主要用在类,构造方法,成员变量,方法,参数等的声明中,作用主要是对编译器警告等辅助工具产生影响,如果传递了错误的类型那么编译器就会发出警告,这样就能保证这是一份类型安全的代码,用于写底层框架,开源框架,sdk等非常有用。注解主要有以下类

资源型注解

通常都是以Res结尾,例如AnimatorResAnimRes,通常都是用于对资源的类型安全的检查作用,例如:

public void setColor(@ColorRes int color){
   this.color = color;
}

此处的@ColorRes就表示传递的资源类型必须是类似R.color.red等的颜色资源,传入别的编译器将会发出警告,通常都是以什么开头的就是校验什么类型的资源

类型注解

例如@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);
 public abstract int getNavigationMode();

NavigationMode是我们创建的一个新注解并且用@IntDef标注它,通过@IntDef我们为返回值或者参数指定了可用的常量值。我们还添加了@Retention(RetentionPolicy.SOURCE)告诉编译器这个新定义的注解不需要被记录在生成的.class文件中(译者注:源代码级别的,生成class文件的时候这个注解就被编译器自动去掉了)。

使用这个注解后,如果你传递的参数或者返回值不在指定的常量值中的话,IDE将会发出警告告诉你只能传递指定的常量,其余的@StringDef@LongDef也是同理。

线程类注解

如果一个方法执行相对耗时,需要让他运行在指定的线程中,那么线程注解就派上用场了,线程类注解有:
@UiThread UI线程
@MainThread 主线程
@WorkerThread 子线程
@BinderThread 绑定线程

例如绑定了@UiThread的方法如果没有运行在ui线程,那么编译器将会发生警告,最好的使用场景就是在非UI线程的方法中加入@WorkerThread,如果你在此方法中调用了UI相关的方法,那么编译器将会发生警告,从而避免在子线程中更新UI。

数值约束

如果在一个参数中,你只想取0-100之间的数字,超过就会发生警告怎么做,这时@Size, @IntRange, @FloatRange等注解就排上用场啦,来看看怎么使用把:
最常见的就是设置透明度了:

public void setAlpha(@FloatRange(from=0.0, to=1.0) float alpha) {

此处规定alpha数值只能从0.0 - 1.0之间。
此外还有个强大的@Size注解:它可以指定数组或字符串的长度,最大值,最小值,倍数,例如:
集合不能为空: @Size(min=1)
字符串最大只能有23个字符: @Size(max=23)
数组只能有2个元素: @Size(2)
数组的大小必须是2的倍数 :@Size(multiple=2)

权限注解: @RequiresPermission

有时我们调用某些方法需要特定的权限,这时权限注解就排上用场啦,我们可以指定执行这个函数需要什么权限:

@RequiresPermission(Manifest.permission.SET_WALLPAPER)
public abstract void setWallpaper(Bitmap bitmap) throws IOException;

如果你需要多个权限,可以使用allof

@RequiresPermission(allOf = {
    Manifest.permission.READ_HISTORY_BOOKMARKS, 
    Manifest.permission.WRITE_HISTORY_BOOKMARKS})

如果只需要多个权限中的一个,可以使用anyOf

@RequiresPermission(anyOf= {
    Manifest.permission.READ_HISTORY_BOOKMARKS, 
    Manifest.permission.WRITE_HISTORY_BOOKMARKS})
重载注解@CallSuper

如果你的方法允许被重载但是需要父方法的代码也被调用(也就是保留super)就可以使用该注解,一旦使用者重载了此方法并将super.(xxx)删除那么编译器将会发生警告

上一篇下一篇

猜你喜欢

热点阅读