Android 经典笔记之六:Annotation注释使用介绍

Annotation注释使用介绍
目录介绍
1.Annotation库的简单介绍
2.@Nullable和@NonNull
3.资源类型注释
4.类型定义注释
5.线程注释
6.RGB颜色纸注释
7.值范围注释
8.权限注释
9.重写函数注释
10.返回值注释
11.@Keep注释
12.@SuppressWarnings注解
13.其他
14.后续

好消息

  • 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计47篇[近20万字],转载请注明出处,谢谢!
  • 链接地址:https://github.com/yangchong211/YCBlogs
  • 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变!

1.Annotation库的简单介绍

  • 包含一系列有用元注释,帮助开发者在编译期间发现可能存在的bug
    是属于Support Lib其中之一,独立jar包
  • 通过注释来完善自身代码质量
  • 官方文档:
    AndroidAnnotations是一个能让你进行快速开发的开源框架,它让你关注真正重要的地方,它可以简化你的代码,并且有利于你后期的维护
  • 库的特点
依赖注入(Dependency injection):支持view, extras, system service, resource等等
简单的线程模型(Simplified threading model):进行方法注解以让该方法在UI线程或后台线程进行执行
事件绑定(Event binding):进行方法注解以让方法执行view的时间而不用再添加一些监听
REST client:创建一个接口,AndroidAnnotations用来实现
没有神秘感(No magic):AndroidAnnotations在编译时会产生一个子类,你可以查看子类中的代码来知道它是如何工作的.
编译检测:提供的多种注解,用于检测代码编译时可能存在的异常,并给开发者相关提示,提高代码质量
AndroidAnnotations来实现这些美好的功能,只需要不到150kb的大小

相关文档给出说明:androidannotations.org
这篇文档给出了案例,很好地说明了注释前后代码的区别

2.@Nullable 和 @NonNull

  • 说明:
    检测参数或者方法返回值是否可以为null,这是该框架中最常用也是最基础的注解之一了,使用了这两个注解,在Android Studio中,如果出现代码不安全的情况下,会给出智能提示
@Nullable作用于函数参数或者返回值,标记参数或者返回值可以为空
@NonNull作用于函数参数或者返回值,标记参数或者返回值不可以为空
@NonNull使用举例【**千万别忽视黄色警告-----这个淡黄色警告实际开发中很容易忽视**】
  • 未加注释:


    Image.png
  • 添加注释:


    Image.png
  • 结论:可以看到加上的@NonNull注解后,Android Studio会自动检测不安全的代码并给出友好提示,提示开发者进行修改

  • @Nullable 使用举例


    Image.png
  • 结论:将@Nullable作用在方法上,这样方法的返回值是允许为null的,但是可能会导致某些情况下的crash;

3.资源类型注释

  • 在我们平时开发中我们肯定会经常用到引用一些资源,比如图片资源及字符串资源或者颜色值资源,因为这些资源的类型都是int值,所以有时候我们在给TextView设置字符串资源时也有可能引用了图片资源ID,就会导致有问题,比如会出现以下异常:
    android.content.res.Resources$NotFoundException: String resource ID #0x3039

  • 资源通常是以整型值表示的,保存在R.Java文章中。如果传入资源值不对,那么编译器不会报错,但是运行期会报错。而注解可以避免这个问题。
    资源类型注解主要都有哪些?

@StringRes : 表示参数、变量或者函数返回值应该是一个字符串类型的资源
@ColorInt : 表示参数、变量或者函数返回值应该是一个颜色值而不是颜色资源引用,例如应该是一个 AARRGGBB 的整数值。
@ColorRes : 表示参数、变量或者函数返回值应该是一个 color 类型的资源,而不是颜色值。注意和 ColorInt 区别
@AnimRes : 表示参数、变量或者函数返回值应该是一个 Anim 类型的资源
@DrawableRes : 表示参数、变量或者函数返回值应该是一个 drawable 类型的资源
@DimenRes : 表示参数、变量或者函数返回值应该是一个 dimension 类型的资源
  • 举例子: 这里定义了一个方法,方法中只接受@StringRes注解的int引用
    没有添加注释前


    Image.png

    添加注释后


    Image.png

    结论:添加注释可以在编译器就找到错误

5.线程注释

  • 线程注解主要是用于检测一个函数是否在指定类型的线程中执行
  • 类型
@UiThread:标记运行在UI线程,一个UI线程是Activity运行所在的主窗口,对于一个应用而言,可能存在多个UI线程。每个UI线程对应不同的主窗口。
@MainThread:标记运行在主线程,一个应用只有一个主线程,主线程也是@UiThread线程。通常情况下,我们使用@MainThread来注解生命周期相关函数,使用@UiThread来注解视图相关函数,一般情况下@MianThread和@UiThraed是可以互换的。
@WorkerThread:标记运行在后台运行线程。
@BinderThread:标记运行在Binder线程
  • 举例子
public void threadtest(){ 
    new Thread(new TimerTask() { 
        @Override 
        public void run() { 
            setTest(); 
        } 
    }).start(); 
} 

@UiThread 
public void setTest(){ 
    test.setText("测试"); 
}
**那么上面会报错。提示:不做线程切换,只起到提示作用!**

6.RGB颜色纸注释

  • 在资源类型注解中我们使用@ColorRes来标记参数类型需要传入颜色类型的id,而使用@ColorInt注解是标记参数类型需要传入RGB或者ARGB颜色值的整型值。
  • 举例子,阅读TextView源代码中的setTextColor方法
Image.png

7.值范围注释

  • 当函数参数的取值在一定范围时,可以使用注解来防止调用者传入错误的参数,主要注解有三种。
  • @Size
@Size:对于类似数组、集合和字符串之类的参数,我们可以使用@Size注解来表示这些参数的大小。
用法:
@Size(min=1)//可以表示集合不可以为空
@Size(max=23)//可以表示字符串最大字符个数为23
@Size(2)//表示数组元素个数为2个
@Size(multiple=2)//可以表示数组大小是2的倍数
  • @IntRange:参数类型是int或者long,用法如下

    public void setInt(@intRange(from=0,to=255)){...}

  • @FloatRange:参数类型是float或者double,用法如下

    public void setFloat(@FloatRange(from=0.0,to=1.0)){...}

  • 举个例子

  • @FloatRange 用法

Image.png
  • @Size用法
Image.png
  • 数组只能有2个元素: @Size(2)
Image.png

8.权限注释

  • Android应用在使用某些系统功能时,需要在AndroidManifest,xml中声明权限,否则在运行时就会提示缺失对应的权限,为了在编译时及时发现权限的缺失,我们可以使用@RequiresPermission注解。
  • 如果需要一个权限则加注解。
     @RequiresPermission(Manifest.permission.SET_WALLPAPER)
  • 如果需要一个集合至少一个权限,那么就加注解。
     @RequiresPermission(anyOf = {Manifest.permission.SET_WALLPAPER,Manifest.permission.CAMERA})
  • 如果同时需要多个权限,那么就加注解。
     @RequiresPermission(allOf = {Manifest.permission.SET_WALLPAPER,Manifest.permission.CAMERA})
  • 对于Intent调用所需权限的ACTION字符串定义处添加注解。
     @RequiresPermission(android.Manifest.permission.BLUETOOTH)
     String ACTION_REQUEST_DISCOVERRAVLE = "android.bluetooth.adapter.REQUEST_DISCOVERRAVLE";
  • 对于ContentProvider所需权限,可能有读和写两个操作。对应不同的权限。
@RequiresPermission.Read(@RequestPermission(READ_HISTORY_BOOLMARKS))
@RequiresPermission.Write(@RequestPermission(WRITE_HISTORY_BOOLMARKS))
public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks);

9.重写函数注释

  • 如果API允许重写某个函数,但是要求在重写该函数时需要调用super父类的函数。
    可以加注解@CallSuper来提示开发者。若是重写不调用super就会报错
    举例子
Image.png

10.返回值注释

  • 该注解是为了检测方法返回值是否是需要使用的,如果没有被使用,则AndroidStudio会给出警告提示
    @CheckResult使用案例

  • 添加注释:

Image.png

11.@Keep注释

  • @keep是用来标记在Proguard混淆过程中不需要混淆的类或者方法。在混淆时一些不需要混淆的会使用
    -keep class com.foo.bar{public static <method>}

  • 有了@Keep之后,就可以在编码时标注出一些不需要混淆的类或者方法

12.@SuppressWarnings注解

  • 这个注解在源码里是随处可见,其实它的用法很简单,就是对一些警告信息的过滤。
    源代码
Image.png
  • 这个注解是可以使用在属性、方法、构造方法、变量等等。那么它的参数就是一个字符串数组。可以单个,可以多个。
    示例
@SuppressWarnings("unchecked")
告诉编译器忽略 unchecked 警告信息,如使用List,ArrayList等未进行参数化产生的警告信息。
@SuppressWarnings("serial")
如果编译器出现这样的警告信息:The serializable class WmailCalendar does not declare a static final serialVersionUID field of type long使用这个注释将警告信息去掉。
@SuppressWarnings("deprecation")
如果使用了使用@Deprecated注释的方法,编译器将出现警告信息。使用这个注释将警告信息去掉。
@SuppressWarnings("unchecked", "deprecation")
告诉编译器同时忽略unchecked和deprecation的警告信息。
@SuppressWarnings(value={"unchecked", "deprecation"})
等同于@SuppressWarnings("unchecked", "deprecation")

13.其他

@EActivity、@ViewById、@Click
这三个注解应该是对我们的代码简洁性最有帮助的
@EActivity : 后面需要跟上一个layout id,来标示该Activity所加载的xml布局,这样原来的onCreate()方法就不用写了;
@ViewById : 与findViewById作用一致,而且@ViewById后面可以不写控件id,前提是控件变量名要与控件id一致
@Click : 也就是控件的点击事件,而且如果控件ID与方法名一致,后面就不用写控件ID了. 该注解可以单独写,也可以对多个Button合并写

代码案例

//这里加注解就可以不写onCreate方法 
@EActivity(R.layout.activity_test_annotation) 
public class TestAnnotation extends AppCompatActivity { 

    @ViewById(R.id.tv_name)//如果变量名和控件ID一致,后面就不用写id 
    TextView tv_name; 

    @Click(R.id.showName)//如果控件ID与方法名一致,后面就不用写id 
    public void showName(){ 
        Toast.makeText(this,tv_name.getText(),Toast.LENGTH_SHORT).show(); 
    } 
}   

14.后续

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,332评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,930评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,204评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,348评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,356评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,447评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,862评论 3 394
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,516评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,710评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,518评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,582评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,295评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,848评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,881评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,121评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,737评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,280评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,354评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,577评论 18 139
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,134评论 9 118
  • 从昨天开始,小R先森就开始了不舒服,先是呕吐,喷射性呕吐,3次,直到晚上才一次臭臭,到了今天,没有呕吐,却拉了9...
    小sev7en阅读 347评论 0 1
  • 人生,不在于活了多长时间,而在于记住了多少时间呀! 姑妈在堂屋和邻居们在说话,堂屋门槛旁边有一条毛毛虫,一个人说,...
    藤木同学阅读 157评论 0 0