Android 常用注解

868 阅读4分钟

IntDef 和 StringDef 注解

主要使用 IntDefStringDef 注解替代枚举。

例如:

public static final int RED = 0x1;
public static final int GREEN = 0x2;
public static final int BLUE = 0x3;

@IntDef({RED, GREEN,BLUE})
@Retention(RetentionPolicy.SOURCE)
public @interface BgColor{}

private int color;

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

@BgColor
public int getColor() {
    return color;
}

Nullness 注解

注解标识 描述
@Nullable 标记参数或者返回值可以为空
@NonNull 标记参数或者返回值不可以为空

注意:在使用的过程中发现在最新版本的AndroidStudio中不添加@Nullable和@NonNull,编译器也同样会提示响应的警告,所以这个注解可以忽略使用。

资源类型注解

注解标识 描述
@AnimatorRes 标记整形值为android.R.animator类型(属性动画相关)
@AnimRes 标记整形值为android.R.anim类型(补间动画相关)
@XmlRes 标记整形值为android.R.xml类型
@AnyRes 任何资源类型
@ArrayRes 数组资源类型
@AttrRes 属性资源类型
@BoolRes bool类型资源类型
@ColorRes 颜色资源类型
@DimenRes 长度资源类型
@DrawableRes 图片资源类型
@IdRes 资源id
@InterpolatorRes 动画插值器
@LayoutRes layout资源
@MenuRes menu资源
@RawRes raw资源
@StringRes 字符串资源
@StyleRes style资源
@StyleableRes Styleable资源类型
@TransitionRes transition资源类型

Threading 注解

注解标识 描述
@UiThread UI线程 (对一个应用而言可能存在多个UI线程,每个UI线程对应不同Activity的主窗口)
@MainThread 主线程 (一个应用只有一个主线程, 当然主线程也是UI线程)
@WorkerThread 子线程
@BinderThread 绑定线程

Value Constraints 注解

注解标识 描述
@Size 定义长度大小,可选择最小和最大长度使用 (min = 1, max = 100),主要用于对于类似数组、集合和字符串之类的参数
@IntRange IntRange是用来指定int类型范围的注解
@FloatRange FloatRange和IntRange用法一样,不过是指定的是float类型的数据对象

@CallSuper 注解

如果API允许调用者重写某个函数,但同时要求重写的函数需要调用被重写的函数, 那么可使用 @CallSuper 注解。

@CallSuper 注解主要是用来强调在覆盖父类方法时,需要实现父类的方法,及时调用对应的super.xxx方法,当用 @CallSuper 修饰了该方法,如果子类覆盖后的方法没有实现super方法会抛出异常。

@CheckResult 注解

如果函数需要调用者对返回值做某些处理,那么可以使用 @CheckResult 注解来提示开发者。我们没必要对每个非空返回值的函数都添加这个注解,该注解的主要目的是让调用者在使用API时,不至于怀疑该函数是否会产生副作用。

假设你定义了一个方法返回一个值,你期望调用者用这个值做些事情,那么你可以使用 @CheckResult 注解标注这个方法,强制用户定义一个相应的返回值,使用它!

此外还可以指定警告信息

//如果调用者没有检查函数的返回值,Android Studio将会给出警告
//警告信息中包含suggest指定的内容
@CheckResult(suggest="#enforcePermission(String,int,int,String)")
@PackageManager.PermissionResult
public abstract int checkPermission(@NonNull String permission, int pid, int uid);

权限注解

Android应用在使用某些系统功能时,需要在 AndroidManifest.xml 中声明权限,否则在运行时会提示缺失对应的权限。为了在编译期及时发现缺失的权限,我们可以使用 @RequiresPermission 注解。

//表明调用该函数需要声明一个权限
@RequiresPermission(Manifest.permission.CHANGE_NETWORK_STATE)
public void setDataEnable() {
    ..........
}

//表明调用该函数需要声明集合中至少一个权限
@RequiresPermission(anyOf = {
        Manifest.permission.CHANGE_NETWORK_STATE, Manifest.permission.INTERNET})
public void setDataEnable() {
    .........
}

//表明调用该函数需要声明集合中所有的权限
@RequiresPermission(allOf = {
        Manifest.permission.CHANGE_NETWORK_STATE, Manifest.permission.INTERNET})
public void setDataEnable() {
    .........
}

除了修饰函数外,该注解还可以修饰Intent对应的ACTION字段或ContentProvider对应的Uri,例如:

@RequiresPermission(Manifest.permission.ACCESS_WIFI_STATE)
public static final String ACTION_TEST = "com.zj.test.Wifi";

//对于ContentProvider可能需要读和写这两个操作,对应不同的权限声明
@RequiresPermission.Read(@RequiresPermission("read_permission"))
@RequiresPermission.Write(@RequiresPermission("write_permission"))
public static final Uri TEST_URI = Uri.parse("content://test/info");

测试可见注解

单元测试中,可能需要访问到一些不可见的类、函数或变量,这时可以使用@VisibleForTesting注解来使其对测试可见。

Keep注解

@Keep 注解用来标记在Proguard混淆过程中不需要混淆的类或者方法,例如:

public class Test {
    @Keep
    public void test() {
        ..........
    }
}





About Me