请使用Support Annotations 进行代码检查
1.Support Annotations 是什么?
Support Annotations 是Android 官方注解支持库。(如果对 Annotation 不了解的可参考:Java Annotation)主要作用是用于在编译期间进行代码检查,能在编译期间提示代码是否符合规范,参数是否为null,是否正确等。
将以下代码行添加到 build.gradle文件的dependencies块中,即可添加support-annotations依赖
compile 'com.android.support:support-annotations:25.3.1'
Support Annotations 内容
1.资源注解
@AnimatorRes :Xml资源属性动画注解
@AnimRes :Xml资源动画
@AnyRes :能够指示注解的参数可为任意类型的R资源,但并不能区别出类型
@ArrayRes :用于指定R.array.*类型数据
@AttrRes :自定义属性 R.attr.*
@BoolRes : 指定R.bool.* Boolean类型资源
@ColorRes :指定R.color.* 颜色资源
@DimenRes:指定 R.dimen.*大小资源
@DrawableRes :图片资源 R.drawable.*
@IdRes : id 资源文件 R.id.*
@IntegerRes :int 资源id R.integer.*
@InterpolatorRes :动画插值器资源 R.interpolator.*
@LayoutRes :指定layout 资源文件 R.layout.*
@MenuRes : 指定菜单文件 R.menu.*
@RawRes : 指定本地音频文件 R.raw.*
@StringRes : 指定字符串常量 R.string.*
@StyleableRes:指定自定义属性集合 R.styleable.*
@StyleRes: 指定样式 R.style.*
@TransitionRes : 指定 过度动画资源 R.transition.*
@XmlRes : 指定xml 资源文件 R.xml.*
以上就是常用的资源注解,资源注解能帮助我们在编译期间发现方法调用,传参可能出现的问题,IDE能提前发现问题,并提示给我们。说了那么多举个栗子吧!
比如再启动一个新Activity 添加一个转场动画我们可以写这样的代码:
本来enterAnim 和 exitAnim 应该是R.anim 资源动画 但是我给他们传值R.id.basic,0发现IDE并没有提示我的参数是否合法,这样就只能运行时才能发现我的参数是错误的,这样效率真的降低了,那么现在引入注解就完全不一样了...
我们把方法参数加上@AnimRes 注解 发现IDE 会自动检查我们的参数是否正确并给出警告,这样就在编译期间发现这些bug提高效率了
使用资源注解很简单只需要在方法,变量定义处添加注解即可
调用2.线程注解
@MainThread和@UiThread注解效果相同,因此可以从@MainThread方法调用@UiThread方法,反之也可。@WorkerThread 用于注解一个工作线程 @BinderThread 用于指定线程为绑定线程 @AnyThread 可以注解任何线程
3.约束注解
约束注解包括:@IntRange、@FloatRange 和 @Size
@FloatRange 用于约束double 类型参数范围使用如下:
@FloatRange 注解form double 类型 用户指定参数开始值
to double 类型 用于指定参数最大值
fromInclusive Boolean 类型 用于控制参数是否可以和form的值相同(默认 true)
toInclusive Boolean 类型 用于控制参数是否可以和to的值相同 (默认 true)
@IntRange 用于约束整型数据参数范围使用如下:
@IntRange 注解使用方式和@FloatRange 一致 不过并没有fromInclusive, toInclusive 控制条件
@Size 注解可以检查集合或数组的大小,以及字符串的长度。@Size注解可用于验证以下
min 表示最小大小(例如@Size(min=2))
max 表示最大大小(例如@Size(max=2))
确切大小(例如@Size(2))
multiple 表示大小必须为此倍数的数字(例如@Size(multiple=2))
例如:
@Size 注解4.权限注解
@RequiresPermission
使用@RequiresPermission注解可以检查方法调用方的权限是否拥有权限。(Android 6.0 需要动态申请隐私权限,不了解的可点此处:Android 6.0 Permissions)。
要检查有效权限列表中是否存在某个权限,请使用anyOf属性。要检查是否存在一组权限,请使用allOf属性。
@RequiresPermission 注解startCamera() 要拥有启动照相机的权限,copyFile() 需要拥有读取和写入SD卡的权限 。对于 intent 权限,可直接将要申请的权限定义在字符串常量上。
对于需要单独读写权限的可使用@RequiresPermission.Read或@RequiresPermission.Write注解
@RequiresPermission.Write,@RequiresPermission.Read5.返回值注解
@CheckResult 注解是用来检查实际使用的是方法的结果还是返回值。并不是标注方法返回值不是null
6.Callsuper 注解
@CallSuper注解用于检查子类重写的方法是否调用父类方法 super.* 示例:
我们先定义一个抽象类 BaseActivity 定义一个bindView()使用@CallSuper 注解
BaseActivity之后在新建一个UserActivity 继承 BaseActivity 之后实现 bindView() 如果不加上super.bindView(); 就会提示出错 这就是 @CallSuper 注解 的作用
UserActivity7.Typedef 注解
typedef注解包括 @IntDef和@StringDef 注解。使用@IntDef和@StringDef注解,以便能够创建整型和字符串集的类似枚举类型的引用。
Typedef 注解使用@interface声明新的枚举注解类型。
举个栗子 :假设我们要给一个方法传入固定类型的值怎么传?一般我们有两种做法 1:使用枚举 2:定义常量
现在结合Typedef 就能达到以上两种要求:
getLayoutView() 是根据state 值 返回不同的view
getLayoutViewstate 的值都是常量如下
state 值在上面的getLayoutView()中我们定义的参数是 @ViewState int state 这个@ViewState 就是结合Typedef 自定义注解 使用@IntDef 固定了@ViewState 做参数的类型。
自定义@ViewState注解结合@IntDef这样就能达到想枚举一样使用如下,它规定了state 的值,不能传入其他值,和枚举,常量等使用相同。
调用时IDE提示8.Null ness 注解
Null ness 注解包括 @Nullable和@NonNull注解 @Nullable 表示可以为null @NonNull 表示不能为null
举个例子 当用@NonNull 标识一个参数时 表示参数不能为null,当传入null IDE 就会给出提示,@Nullable 表示可以为null IDE 不做检查 ,这样我们就能根据IDE给出的提示找出原因了
@NonNull 和 @Nullable