IntDef 和 StringDef 注解
主要使用 IntDef
和 StringDef
注解替代枚举。
例如:
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