安卓注解使用详解

作者: 我是黄教主啊 | 来源:发表于2018-11-08 22:24 被阅读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)删除那么编译器将会发生警告

    相关文章

      网友评论

        本文标题:安卓注解使用详解

        本文链接:https://www.haomeiwen.com/subject/ladgxqtx.html