您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > Android

Android注解--初探

时间:2019-09-02 16:37:56  来源:  作者:
Android注解--初探

 

为什么要学注解

  1. 要想看懂很多开源库,如Arouter, dagger,Butter Knife等,不得不先看懂注解;
  2. 想更好地提升开发效率和代码质量,注解可以帮上很大的忙;

本文主要介绍注解开发的大概概念,算是入个门,如果想实践,请关注后续文章

一、什么是注解

JAVA.lang.annotation,接口 Annotation,在JDK5.0及以后版本引入。

注解是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用Annotation,开发人员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充的信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证、处理或者进行部署。

在运行时读取需要使用Java反射机制进行处理。

Annotation不能运行,它只有成员变量,没有方法。Annotation跟public、final等修饰符的地位一样,都是程序元素的一部分,Annotation不能作为一个程序元素使用。

其实大家都是用过注解的,只是可能没有过深入了解它的原理和作用,比如肯定见过@Override,@Deprecated等。

1、注解的作用

注解将一些本来重复性的工作,变成程序自动完成,简化和自动化该过程。比如用于生成Java doc,比如编译时进行格式检查,比如自动生成代码等,用于提升软件的质量和提高软件的生产效率。

2、注解都有哪些

平时我们使用的注解有来自JDK里包含的,也有Android SDK里包含的,也可以自定义。

2.1、JDK定义的元注解

Java提供了四种元注解,专门负责新注解的创建工作,即注解其他注解。

@target 定义了Annotation所修饰的对象范围

ElementType.CONSTRUCTOR:用于描述构造器

ElementType.FIELD:用于描述域

ElementType.LOCAL_VARIABLE:用于描述局部变量

ElementType.METHOD:用于描述方法

ElementType.PACKAGE:用于描述包

ElementType.PARAMETER:用于描述参数

ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明

@retention 定义了该Annotation被保留的时间长短,取值

  • RetentionPoicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;用于做一些检查性的操作,比如 @Override 和 @SuppressWarnings
  • RetentionPoicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;用于在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife)
  • RetentionPoicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;用于在运行时去动态获取注解信息。

@documented 标记注解,用于描述其它类型的注解应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化,不用赋值。

@inherited 标记注解,允许子类继承父类的注解。 这里一开始有点理解不了,需要断句一下,允许子类继承父类的注解。示例:

Target(value = ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
@Inherited 
public @interface Sample { 
 public String name() default ""; 
}
@Sample 
class Test{ 
} 
class Test2 extents Test{ 
} 

这样类Test2其实也有注解@sample 。

2.2 JDK内置的其他注解

Android 开发中经常使用各种资源常量 R.XXX 来引用各种资源。例如 图片资源和字符串资源。这些常量都是 int 类型的,在代码检测的时候没法判断引用的资源是否有错误,比如本来需要一个字符串资源,结果在代码写的时候用了一个颜色资源,这种情况只有通过测试才能发现,有些极端情况可能测试也不容易发现。资源类型注解就是为了解决该问题的,资源注解包含如下几种:

 

资源类型注解

@AnimatorRes 表明该参数、变量或者函数返回值应该是一个 Animator 类型的资源

@AnimRes 表明该参数、变量或者函数返回值应该是一个 Anim 类型的资源

@AnyRes 表明该参数、变量或者函数返回值应该是一个任意类型的资源

@ArrayRes 表明该参数、变量或者函数返回值应该是一个 Array 类型的资源

@AttrRes 表明该参数、变量或者函数返回值应该是一个 attribute 类型的资源

@BoolRes 表明该参数、变量或者函数返回值应该是一个布尔类型的资源

@ColorInt 表明该参数、变量或者函数返回值应该是一个颜色值而不是颜色资源引用,例如应该是一个 AARRGGBB 的整数值。

@ColorRes 表明该参数、变量或者函数返回值应该是一个 color 类型的资源,而不是颜色值。注意和 ColorInt 区别

@DimenRes 表明该参数、变量或者函数返回值应该是一个 dimension 类型的资源

@DrawableRes 表明该参数、变量或者函数返回值应该是一个 drawable 类型的资源

@FractionRes 表明该参数、变量或者函数返回值应该是一个 fraction 类型的资源

@IdRes 表明该参数、变量或者函数返回值应该是一个资源的 ID 类型

@IntegerRes 表明该参数、变量或者函数返回值应该是一个整数类型的资源

@LayoutRes 表明该参数、变量或者函数返回值应该是一个 layout 布局文件类型的资源

@MenuRes 表明该参数、变量或者函数返回值应该是一个 menu 类型的资源

@PluralsRes 表明该参数、变量或者函数返回值应该是一个 plurals 类型的资源

@RawRes 表明该参数、变量或者函数返回值应该是一个 raw 类型的资源

@StringRes 表明该参数、变量或者函数返回值应该是一个字符串类型的资源

@StyleableRes 表明该参数、变量或者函数返回值应该是一个 styleable 类型的资源

@StyleRes 表明该参数、变量或者函数返回值应该是一个 style 类型的资源

@TransitionRes 表明该参数、变量或者函数返回值应该是一个 transition 类型的资源

@XmlRes 表明该参数、变量或者函数返回值应该是一个 XML 类型的资源

线程注解类型

线程注解用来检测一个函数是否在指定类型的线程中执行。 有四个:

  • @UiThread
  • @MainThread
  • @WorkerThread
  • @BinderThread

注意: 其中 @UiThread 和 @MainThread 是可替换用的, 大部分应用中,这两个是一样的。

如果一个类中的所有函数都在同一个线程内执行,可以在 类名称上面用这个注解即可。

权限注解类型

@RequiresPermission 用来表明该函数执行需要一个或者多个权限,如果你没有声明这些权限,则会给出警告。例如:

@RequiresPermission(Manifest.permission.SET_WALLPAPER)
 public abstract void setWallpaper(Bitmap bitmap) throws IOException;
 @RequiresPermission(allOf = {
 Manifest.permission.READ_HISTORY_BOOKMARKS,
 Manifest.permission.WRITE_HISTORY_BOOKMARKS})
 public static final void updateVisitedHistory(ContentResolver cr, String url, boolean real) {
 }
 @RequiresPermission(anyOf = {
 Manifest.permission.READ_HISTORY_BOOKMARKS,
 Manifest.permission.WRITE_HISTORY_BOOKMARKS})
 public static final void updateHistory(ContentResolver cr, String url, boolean real) {
 }

结束

漫漫开发之路,我们只是其中的一小部分……只有不断的学习、进阶,才是我们的出路!才跟得上时代的进步!

今年年初我花一个月的时间收录整理了一套知识体系,如果有想法深入的系统化的去学习的,可以私信我【安卓,我会把我收录整理的资料都送给大家,帮助大家更快的进阶。



Tags:Android   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
今天面试遇到同学说做过内存优化,于是我一般都会问那 Bitmap 的像素内存存在哪?大多数同学都回答在 java heap 里面,就比较尴尬,理论上你做内存优化,如果连图片这个内存大户内存...【详细内容】
2021-12-23  Tags: Android  点击:(8)  评论:(0)  加入收藏
Android logcat日志封装logcat痛点在Android开发中使用logcat非常频繁,logcat能帮我们定位问题,但是在日常使用中发现每次使用都需要传递tag,并且会遇到输出频率很高的log,在多...【详细内容】
2021-12-22  Tags: Android  点击:(8)  评论:(0)  加入收藏
对项目的基本介绍 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自动生成接口方法 2.用Kotlin的Flow去代替Rxjava,因为我发现RxJava功能很...【详细内容】
2021-12-08  Tags: Android  点击:(17)  评论:(0)  加入收藏
前言在Android开发过程中,有些时候会根据需要引用别的项目到当前项目里面,而且以Module形式引用。所以本篇博文就来分享一下怎么以Module形式引用别的项目到当前项目中,方便开...【详细内容】
2021-12-07  Tags: Android  点击:(22)  评论:(0)  加入收藏
新型Android恶意木马程序伪装成数十款街机、射击和策略游戏,通过华为应用市场AppGallery进行分发,从而窃取设备信息和用户的手机号码,全球目前至少有930万台Android设备被该恶...【详细内容】
2021-12-01  Tags: Android  点击:(24)  评论:(0)  加入收藏
作者:fundroid这篇文章偏阅读一些,大家可以了解下 Android 的一些最新动向。每年9/10月份 Google 都会举行约为期2天的 Android Dev Summit,在活动上 Google 的技术专家们会分...【详细内容】
2021-11-30  Tags: Android  点击:(15)  评论:(0)  加入收藏
一、 准备工作1、安装JDK,下载地址(可能需要一个oracle账号,大家百度一下或者自行注册一个就行。尽可能选择8或者11,这两个是长期版本)Java SE | Oracle Technology Network | Or...【详细内容】
2021-11-23  Tags: Android  点击:(28)  评论:(0)  加入收藏
如果你是一名忠实的Android玩家,那么可能会知道,今年的Android 12系统在版本规划上与“往届”相比可以说是很有些特殊。具体来说,除了前段时间刚刚推出正式版的Android 12外,谷...【详细内容】
2021-11-10  Tags: Android  点击:(24)  评论:(0)  加入收藏
使用Maven Publish Plugin插件。(官方支持)一、在Library的build.gradle中配置plugins { id 'com.android.library' id 'kotlin-android' id 'k...【详细内容】
2021-11-05  Tags: Android  点击:(37)  评论:(0)  加入收藏
今年5月,谷歌推出了Android 12,这是原生安卓系统史上最大的设计变化,10月4日,谷歌推出全新的Android12正式版本,并且宣布会在今年晚些时候应用于安卓设备,对比Android11的挤牙膏式...【详细内容】
2021-10-29  Tags: Android  点击:(125)  评论:(0)  加入收藏
▌简易百科推荐
今天面试遇到同学说做过内存优化,于是我一般都会问那 Bitmap 的像素内存存在哪?大多数同学都回答在 java heap 里面,就比较尴尬,理论上你做内存优化,如果连图片这个内存大户内存...【详细内容】
2021-12-23  像程序那样思考    Tags:Android开发   点击:(8)  评论:(0)  加入收藏
Android logcat日志封装logcat痛点在Android开发中使用logcat非常频繁,logcat能帮我们定位问题,但是在日常使用中发现每次使用都需要传递tag,并且会遇到输出频率很高的log,在多...【详细内容】
2021-12-22  YuCoding    Tags:Android   点击:(8)  评论:(0)  加入收藏
对项目的基本介绍 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自动生成接口方法 2.用Kotlin的Flow去代替Rxjava,因为我发现RxJava功能很...【详细内容】
2021-12-08  网易Leo    Tags:Android开发   点击:(17)  评论:(0)  加入收藏
前言在Android开发过程中,有些时候会根据需要引用别的项目到当前项目里面,而且以Module形式引用。所以本篇博文就来分享一下怎么以Module形式引用别的项目到当前项目中,方便开...【详细内容】
2021-12-07  网易Leo    Tags:Android开发   点击:(22)  评论:(0)  加入收藏
作者:fundroid这篇文章偏阅读一些,大家可以了解下 Android 的一些最新动向。每年9/10月份 Google 都会举行约为期2天的 Android Dev Summit,在活动上 Google 的技术专家们会分...【详细内容】
2021-11-30  像程序那样思考    Tags:Android开发   点击:(15)  评论:(0)  加入收藏
一、 准备工作1、安装JDK,下载地址(可能需要一个oracle账号,大家百度一下或者自行注册一个就行。尽可能选择8或者11,这两个是长期版本)Java SE | Oracle Technology Network | Or...【详细内容】
2021-11-23  永沧    Tags:Android   点击:(28)  评论:(0)  加入收藏
使用Maven Publish Plugin插件。(官方支持)一、在Library的build.gradle中配置plugins { id 'com.android.library' id 'kotlin-android' id 'k...【详细内容】
2021-11-05  羊城小阳    Tags:Android   点击:(37)  评论:(0)  加入收藏
谷歌离推出Play Store应用程序的新数据隐私部分又近了一步。应用程序开发人员现在可以通过谷歌在Play控制台的新 "数据安全表 "填写相关细节。该公司表示,所需信息将从2022年...【详细内容】
2021-10-20    中关村在线  Tags:安卓   点击:(58)  评论:(0)  加入收藏
架构究竟是什么?如何更好的理解架构?我们知道一个APP通常是由class组成,而这些class之间如何组合,相互之间又如何产生作用,就是影响这个APP的关键点。细分的话我们可以将其分为类...【详细内容】
2021-09-17  像程序那样思考    Tags:Android架构   点击:(52)  评论:(0)  加入收藏
概述当Android应用程序需要访问设备上的敏感资源时,应用程序开发人员会使用权限模型。虽然该模型使用起来非常简单,但开发人员在使用权限时容易出错,从而导致安全漏洞。本文中,...【详细内容】
2021-09-07  SecTr安全团队    Tags:Android开发   点击:(66)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条