前言:

前面学习总结了Java注解的使用,博客地址详见Java学习之注解Annotation实现原理,从本质上了解到什么注解,以及注解怎么使用?不要看见使用注解就想到反射会影响性能之类,今天我们就来学习一下Android Support Annotations注解来优化我们的代码,增加可读性的同时,也让让更多的错误消灭在萌芽之中。

Support Annotations简介:

Android support library从19.1版本开始引入了一个新的注解库,它包含很多有用的元注解,你能用它们修饰你的代码,帮助你发现bug。Support library自己本身也用到了这些注解,所以作为support library的用户,Android Studio已经基于这些注解校验了你的代码并且标注其中潜在的问题。

Support Annotations如何引入:

注解默认是没有包含的;它被包装成一个独立的库,如果使用了appcompat库,那么Support Annotations就会自动引入进来,因为appcompat使用了Support Annotations,如果没有则需要在build.gradle中添加如下配置:

dependencies {
compile 'com.android.support:support-annotations:23.4.0'
}

Support Annotations分类:

1.)Nullness注解

@Nullable注解可以用来标识特定的参数或者返回值可以为null。

@NonNull注解可以用来标识参数不能为null。

2.)Resource Type 注解

资源在Android中作为整型值来传递。这意味着希望获取一个drawable作为参数的代码很容易被传递了一个string类型的资源,因为他们资源id都是整型的,编译器很难区分。Resource Type注解在这种条件下可以提供类型检查,例如:

如果类型指定错误,编译不会通过。

常见的Resource Type注解,使用方式都是指定一个integer的参数、成员变量、或者方法,检查对应的资源类型。

  • AnimatorRes animator资源类型
  • AnimResanim资源类型
  • AnyRes:任意资源类型
  • ArrayResarray资源类型
  • AttrResattr资源类型
  • BoolResboolean资源类型
  • ColorRescolor资源类型
  • DimenResdimen资源类型。
  • DrawableResdrawable资源类型。
  • FractionResfraction资源类型
  • IdResid资源类型
  • IntegerResinteger资源类型
  • InterpolatorResinterpolator资源类型
  • LayoutReslayout资源类型
  • MenuResmenu资源类型
  • PluralsResplurals资源类型
  • RawResraw资源类型
  • StringResstring资源类型
  • StyleableResstyleable资源类型
  • StyleResstyle资源类型
  • TransitionRestransition资源类型
  • XmlResxml资源类型

以上基本上包括了所有的资源类型,但是有时需要通过RGB颜色整型来设置颜色值,在这种情况下,你可以使用@ColorInt注解,表示你期望的是一个代表颜色的整数值,如果使用不对同样也是编译不通过

3.)Threading 注解

比如我们在项目中处理比较耗时的操作,需要制定在工作子线程中执行,可以使用Threading 注解,如果没有在制定的线程中执行也是编译不过的

几种Threading注解

  • @UiThread UI线程
  • @MainThread 主线程
  • @WorkerThread 子线程
  • @BinderThread  绑定线程

4.)Typedef 注解:IntDef/StringDef

整型除了可以作为资源的引用之外,也可以用作“枚举”类型使用。

@IntDef和”typedef”作用非常类似,你可以创建另外一个注解,然后用@IntDef指定一个你期望的整型常量值列表,最后你就可以用这个定义好的注解修饰你的API了。

例如:需要自定义网络类型

    private final static int GET=0;
private final static int POST=1;
private final static int DELETE=2;
private final static int PUT=3;
@IntDef({GET, POST, DELETE,PUT})
@Retention(RetentionPolicy.SOURCE)
public @interface ReqType{}

需要在调用时只能传入指定类型,如果传入类型不对,编译不通过

5.)Value Constraints注解:@Size, @IntRange, @FloatRange

在实际开发过程中,我们有时可能需要设置一个取值范围,这时我们可以使用取值范围注解来约束。

比如我们设置一个百分比,取值范围为0-100,

对于数据、集合以及字符串,你可以用@Size注解参数来限定集合的大小(当参数是字符串的时候,可以限定字符串的长度)。

举几个例子

  • 集合不能为空: @Size(min=1)
  • 字符串最大只能有23个字符: @Size(max=23)
  • 数组只能有2个元素: @Size(2)
  • 数组的大小必须是2的倍数 (例如图形API中获取位置的x/y坐标数组: @Size(multiple=2)
6.)Permissions 注解: @RequiresPermission

有时我们的方法调用需要调用者拥有指定的权限,这时我们可以使用@RequiresPermission注解,

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

除了上面的单一使用方式,官方同时也给出了如下几种使用场景

(1)如果你至少需要权限集合中的一个,你可以使用anyOf属性

@RequiresPermission(anyOf = {
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION})
public abstract Location getLastKnownLocation(String provider);

(2)如果你同时需要多个权限,你可以用allOf属性

@RequiresPermission(allOf = {
Manifest.permission.READ_HISTORY_BOOKMARKS,
Manifest.permission.WRITE_HISTORY_BOOKMARKS})
public static final void updateVisitedHistory(ContentResolver cr, String url, boolean real) ;

(3)对于intents的权限,可以直接在定义的intent常量字符串字段上标注权限需求(他们通常都已经被@SdkConstant注解标注过了)

@RequiresPermission(android.Manifest.permission.BLUETOOTH)
public static final String ACTION_REQUEST_DISCOVERABLE =
"android.bluetooth.adapter.action.REQUEST_DISCOVERABLE";

(4)对于content providers的权限,你可能需要单独的标注读和写的权限访问,所以可以用@Read或者@Write标注每一个权限需求

@RequiresPermission.Read(@RequiresPermission(READ_HISTORY_BOOKMARKS))
@RequiresPermission.Write(@RequiresPermission(WRITE_HISTORY_BOOKMARKS))
public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks");
7.)Overriding Methods 注解: @CallSuper

如果你的API允许使用者重写你的方法,但是呢,你又需要你自己的方法(父方法)在重写的时候也被调用,这时候你可以使用@CallSuper标注

例如:Activity的onCreate函数

@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState)

用了这个后,当重写的方法没有调用父方法时,工具就会给予标记提示

8.)Return Values注解: @CheckResult

如果你的方法返回一个值,你期望调用者用这个值做些事情,那么你可以使用@CheckResult注解标注这个方法。

这个在具体使用中用的比较少,除非特殊情况,比如在项目中对一个数据进行处理,这个处理比较耗时,我们希望调用该函数的调用者在不需要处理结果的时候,提示没有使用,酌情删除调用。

9.)其他注解

   Keep:指出一个方法在被混淆的时候应该被保留。

   VisibleForTesting:可注解一个类,方法,或变量,表示有更宽松的可见性,这样它能够有更宽泛的可见性,使代码可以被测试。

10.)IntelliJ注解

IntelliJ,Android Studio就是基于它开发的,IntelliJ有一套它自己的注解;IntDef分析其实重用的是MagicConstant分析的代码,IntelliJ null分析其实用的是一组配置好的null注解。如果你执行Analyze > Infer Nullity…,它会试图找出所有的null约束并添加他们。这个检查有时会插入IntelliJ注解。你可以通过搜索,替换为Android注解库的注解,或者你也可以直接用IntelliJ注解。在build.gradle里或者通过Project Structure对话框的Dependencies面板都可以添加如下依赖:

dependencies {
compile 'com.intellij:annotations:12.0'
}

小结:

经过查阅资料,系统了学习了Support Annotations注解,学以致用,通过这个Support Annotations可以提高代码可读性,同时可以在类加载时就可以检查一些错误,同时不会对性能有任何影响,因为Support Annotations中的注解的生命周期全部是RetentionPolicy.CLASS。接下来准备在项目中大量推广使用。

Android注解使用之使用Support Annotations注解优化代码的更多相关文章

  1. Android注解支持(Support Annotations)

    注解支持(Support Annotations) Android support library从19.1版本开始引入了一个新的注解库,它包含很多有用的元注解,你能用它们修饰你的代码,帮助你发现bu ...

  2. Android注解支持(Support Annotations) (转)

    原文地址:http://www.flysnow.org/2015/08/13/android-tech-docs-support-annotations.html 注解支持(Support Annot ...

  3. Android注解支持Support Annotations详解

    ###注解支持(Support Annotations)Android support library从19.1版本开始引入了一个新的注解库,它包含很多有用的元注解,你能用它们修饰你的代码,帮助你发现 ...

  4. Android Support Annotations :安卓注解快速上手

    我们都知道,安卓资源文件都是int类型的ID来保存其引用,通过注解类型,可以让我们在写代码的时候,及时发现参数类型的错误,避免潜在的BUG,如下: 我们通过@LayoutRes指定了参数必须要是R.l ...

  5. Android Support库——support annotations

    Android Support库是官方出的支持扩展库,包含了丰富的组件.工具类等,通过在Android SDK Manager中勾选以下两项来获取到. 其中,Android Support Libra ...

  6. Android中的IOC框架,完全注解方式就可以进行UI绑定和事件绑定

    转载请注明出处:http://blog.csdn.net/blog_wang/article/details/38468547 相信很多使用过Afinal和Xutils的朋友会发现框架中自带View控 ...

  7. Android中的自定义注解(反射实现-运行时注解)

    预备知识: Java注解基础 Java反射原理 Java动态代理 一.布局文件的注解 我们在Android开发的时候,总是会写到setContentView方法,为了避免每次都写重复的代码,我们需要使 ...

  8. Hibernate Annotations 注解

    Hibernate Annotations 注解 对于org.hibernate.annotations与org.hibernate.persistence,它的注释比如Columns,可是不知道怎么 ...

  9. 【转】Android中的IOC框架,完全注解方式就可以进行UI绑定和事件绑定

    转载请注明出处:http://blog.csdn.net/blog_wang/article/details/38468547 相信很多使用过Afinal和Xutils的朋友会发现框架中自带View控 ...

随机推荐

  1. ABP教程-打造一个《电话簿项目》-目录-MPA版本-基于ABP1.13版本

    此系列文章会进行不定期的更新,应该会有6章左右. 感兴趣的朋友可以跟着看看,本教程适合已经看过ABP的文档但是又无从下手的小伙伴们. 初衷: 发布系列教程的原因是发现ABP在园子火了很久,但是发现还是 ...

  2. ABP文档 - Javascript Api - Message

    本节内容: 显示信息 确认 Message API给用户显示一个信息,或从用户那里获取一个确认信息. Message API默认使用sweetalert实现,为使sweetalert正常工作,你应该包 ...

  3. Asp.Net MVC中使用StreamReader读取“Post body”之应用场景。

    场景:有三个市场(Global.China.USA),对前台传过来的数据有些验证需要细化到每个市场去完成. 所以就出现了基类(Global)和派生类(China.USA) 定义基类(Global)Pe ...

  4. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  5. 谱聚类(spectral clustering)原理总结

    谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时聚类的计算量也小很多,更加难能可贵的是实现起来也 ...

  6. C# 给word文档添加水印

    和PDF一样,在word中,水印也分为图片水印和文本水印,给文档添加图片水印可以使文档变得更为美观,更具有吸引力.文本水印则可以保护文档,提醒别人该文档是受版权保护的,不能随意抄袭.前面我分享了如何给 ...

  7. jquery.each()

    $(selector).each(function(index,element)) index - 选择器的 index 位置 element - 当前的元素(也可使用 "this" ...

  8. U盘安装Kali 出现cd-rom无法挂载 已解决

    用U盘安装Kali Linux的过程中,出现cd-rom无法挂载的现象,百度坑比啊,醉了.下面亲测成功 出现无法挂载后,选择执行shell 第一步:df -m此时会看到挂载信息,最下面的是/dev/* ...

  9. Windows Server 2008 R2 下配置TLS1.2,添加自签名证书

    前言 2017年1月1日起App Store上的所有App应用将强制开启ATS功能. 苹果的ATS(App Transport Security)对服务器硬性3点要求: ① ATS要求TLS1.2或者 ...

  10. BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]

    2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 3352  Solved: 919[Submit][Stat ...