概述

Support Annotation Library是在Android Support Library19.1版本开始引入的一个全新的函数包,它包含了诸多有用的元注解。用来帮助开发者在编译期间发现可能存在的bug。Support Library本身也使用Annotations Library提供的注解来完善Library的代码质量。 
Android的每一个版本都在不断的完善Annotation Library,在Android Support Library22.2版本中,又新增了13种新的Annotation Library注解。Android Support Library发展到25,已经有多个独立的jar,如我们常见的Support-v4,Support-v7…

Annotation Library的使用

如果我们的sdk安装了Android Support Respository,那么我们可以打开工程的Srrucure,选中Module,选中Dependencies选项卡,点击添加按钮,选中Android Library。然后通过gradle可以很容易的把这些注解添加到我们的工程中。

compile 'com.android.support:support-annotations:23.1.1'
  • 1
  • 1

常用注解

Nullness注解

使用@NonNull注解修饰的参数不能为null。在下面的代码例子中,我们有一个取值为null的name变量,它被作为参数传递给sayHello函数,而该函数要求这个参数是非null的String类型:

public class MainActivity extends ActionBarActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);String name = null;sayHello(name);}void sayHello(@NonNull String s) {Toast.makeText(this, "Hello " + s, Toast.LENGTH_LONG).show();}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

由于代码中参数String s使用@NonNull注解修饰,因此IDE将会以警告的形式提醒我们这个地方有问题。 

资源类型注解

我们知道在Android中,资源通常以整型表示,并保存在R.Java中,这意味着如果资源传的是String类型,则编译就会报错,为了给开发者以提示,Android有了资源类型注解,在最新的版本中,每种资源都对应一种注解。 
 
常见的资源型注解如下: 
AnimRes 
AnimatorRes 
AnyRes 
ArrayRes 
AttrRes 
BoolRes 
ColorRes 
DimenRes 
DrawableRes 
FractionRes 
IdRes 
IntegerRes 
InterpolatorRes 
LayoutRes 
MenuRes 
PluralsRes 
RawRes 
StringRes 
StyleRes 
StyleableRes 
TransitionRes 
XmlRes

类型定义注解

在Android开发中,整型不仅用来代表资源引用值,还可以用来代表枚举,IntDef注解就是用来定义整型的新注解,我们可以用来标记我们自己编写的api,例如:

public class IceCreamFlavourManager {private int flavour;public static final int VANILLA = 0;public static final int CHOCOLATE = 1;public static final int STRAWBERRY = 2;@IntDef({VANILLA, CHOCOLATE, STRAWBERRY})public @interface Flavour {}@Flavourpublic int getFlavour() {return flavour;}public void setFlavour(@Flavour int flavour) {this.flavour = flavour;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

这时如果我们使用错误的整型值调用IceCreamFlavourManager.setFlavour时,IDE将报错。 
 
当然我们也可以指定整型值作为标志位,也就是说这些整型值可以使用’|’或者’&’进行与或等操作。如果我们把@Flavour定义为如下标志位。

@IntDef(flag = true, value = {VANILLA, CHOCOLATE, STRAWBERRY})public @interface Flavour {}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

那么我们可以这么调用。

iceCreamFlavourManager.setFlavour(IceCreamFlavourManager.VANILLA & IceCreamFlavourManager.CHOCOLATE);
  • 1
  • 2
  • 1
  • 2

@StringDef用法和@IntDef基本差不多。

权限注解

在Android中,有很多场景都需要使用权限,无论是Marshmallow之前还是之后的动态权限管理.都需要在manifest中进行声明,如果忘记了,则会导致程序崩溃. 好在有一个注解能辅助我们避免这个问题.使用RequiresPermission注解即可。

@RequiresPermission(Manifest.permission.SET_WALLPAPER)public void changeWallpaper(Bitmap bitmap) throws IOException {
}
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

Color值限定注解

上面部分提到了ColorRes,用来限定颜色资源id,这里我们将使用ColorInt,一个用来限定Color值的注解. 在较早的TextView的setTextColor是这样实现的。

public void setTextColor(int color) {mTextColor = ColorStateList.valueOf(color);updateTextColors();
}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

线程注解

Android开发中经常会涉及到很多线程,如主线程,子线程等操作。我相信大家在使用什么EventBus,消息总线…看的比较多,Android中提供了四个与线程相关的注解。

  • @UiThread,通常可以等同于主线程,标注方法需要在UIThread执行,比如View类就使用这个注解
  • @MainThread 主线程,经常启动后创建的第一个线程
  • @WorkerThread 工作者线程,一般为一些后台的线程,比如AsyncTask里面的doInBackground就是这样的.
  • @BinderThread 注解方法必须要在BinderThread线程中执行,一般使用较少. 
    例如大名鼎鼎的AsyncTask。
new AsyncTask<Void, Void, Void>() {//doInBackground is already annotated with @WorkerThread@Overrideprotected Void doInBackground(Void... params) {return null;updateViews();//error}};@UiThread
public void updateViews() {Log.i(LOGTAG, "updateViews ThreadInfo=" + Thread.currentThread());
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

注意,这种情况下不会出现错误提示。

new Thread(){@Overridepublic void run() {super.run();updateViews();}
}.start();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

虽然updateViews会在一个新的工作者线程中执行,但是在compile时没有错误提示。因为它的判断依据是,如果updateView的线程注解(这里为@UiThread)和run(没有线程注解)不一致才会错误提示.如果run方法没有线程注解,则不提示。

CallSuper重写函数注解

重写的方法必须要调用super方法。使用这个注解,我们可以强制方法在重写时必须调用父类的方法 比如ApplicationonCreate,onConfigurationChanged等。

@Keep注解

在Android编译生成APK的环节,我们通常需要设置minifyEnabled为true实现下面的两个效果 
混淆代码 
删除没有用的代码 
但是出于某一些目的,我们需要不混淆某部分代码或者不删除某处代码,除了配置复杂的Proguard文件之外,我们还可以使用@Keep注解 。

@Keep
public static int getBitmapWidth(Bitmap bitmap) {return bitmap.getWidth();
}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

返回值注解

我们开发的时候,有时候需要对返回的值做一些出来,那么久用到了@CheckResult注解,如果一个方法得到了结果,却没有使用这个结果,就会有错误出现,一旦出现这种错误,就说明你没有正确使用该方法。

@CheckResult
public String trim(String s) {return s.trim();
}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

注解在Android开发中随处可以看到,如ButterKnife,afinal,eventbus等,这些都大大提高了我们的开发效率。

Android Support Annotation Library使用详解相关推荐

  1. Android进阶系列之Support Annotation Library使用详解

    *本篇文章已授权微信公众号 hongyangAndroid (鸿洋)独家发布 在Android开发中,注解使用那是相当之频繁,对于没有了解过注解的猿友来说,看起来那是相当费劲儿.那今天我就来详细的瞅瞅 ...

  2. Support Annotation Library使用详解

    Support Annotation Library是从Android Support Library19.1开始引入的一个全新的函数包.包含一系列的元注解,用来帮助开发者在编译间发现可能存在的bug ...

  3. Support Annotation Library 使用详解

    Support Annotation Library 是提供了一系列元注解,用来帮助开发者在编译期间发现可能存在的BUG. 1. Nullness 注解 此类注解包含 : @Nullable 作用于函 ...

  4. 关于Android Service真正的完全详解,你需要知道的一切

    转载请注明出处(万分感谢!):  http://blog.csdn.net/javazejian/article/details/52709857  出自[zejian的博客]   Service全部 ...

  5. 基于百度地图实现Android定位功能实现(详解+教程)

    基于百度地图实现Android定位功能实现(详解+教程) 1.初始化 (一)获取到SHA1 (1)找到View中的Tool Windows并打开Terminal (2)找到你的jdk的bin目录,小编 ...

  6. 关于Android Service真正的完全详解,你需要知道的一切

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52709857 出自[zejian的博客]   Service全部内容 ...

  7. Android Gradle manifestPlaceholders 占位符详解

    Android Gradle manifestPlaceholders 占位符详解 在实际项目中,AndroidManifest里十几个地方的值是需要动态的改变(生成apk文件的时候).如果每次去改也 ...

  8. Android Loader 异步加载详解二:探寻Loader内部机制

    Android Loader 异步加载详解二:探寻Loader内部机制 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/7025991 ...

  9. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高...

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

最新文章

  1. 变压器符号_3D动画解析油浸式和干式变压器,看完让你秒懂
  2. C#-修改图书借阅管理系统-错误与SQL server 2008错误、复制数据库
  3. vscode 新建php模板,使用vscode快速建立vue模板
  4. 如何设置 homestead zhong redis 开机自启_CentOS安装Redis
  5. JavaJDBC【三、增删改查】
  6. 用jquery模仿的a的title属性
  7. linux内核PID管理
  8. eclipse如何以javadoc方式查看源码的注释
  9. 从Asp.net实现资源全球化和本地化
  10. 拓端tecdat|R语言社区主题检测算法应用案例
  11. 技术实力 gw4c20b型2.0t汽油发_自动挡轻客B型房车底盘,大通与依维柯哪家强?...
  12. 如何快速调出软键盘_天生我材必有用 | 如何快速的计算和调用防火阀、调节阀、铝合金风口等材料价格...
  13. “标注神器”——Zeplin使用教程(Ps版)
  14. GE Predix 详解
  15. html拖拽模态框,bootstrap模态框实现拖拽效果
  16. java即时通讯源码 IM即时通讯源码 IM源码 安卓苹果原生APP源码 带音视频
  17. Java 中正则表达式的经典用法总结——捕获组
  18. 更换介质︰请把标有“Debian GNU/Linux 7.11.0 _Wheezy_ - Official amd64 DVD Binary-1 20160605-17:36“盘片插入驱动器”
  19. c++父类调用子类的方法
  20. 达梦数据库查看登录失败IP地址

热门文章

  1. 测试工程师应懂的Python知识
  2. html导入夸克,index.html
  3. linux系统清理内存,如何清除linux的内存缓存,缓冲和交换空间
  4. tensorflow一维卷积输入_深度学习中的反卷积(Transposed Convolution)
  5. git branch commands
  6. 如何判定括号是否匹配
  7. AI学习笔记(二)图像与视频
  8. seafile自建服务器,自建云盘系列——Seafile (支持分布式存储)
  9. 从零开始刷Leetcode——数组(189.217.219)
  10. 深度学习模型训练的一般方法(以DSSM为例)