Android基础架构设计核心—注解的使用详解

导读:本篇文章讲解 Android基础架构设计核心—注解的使用详解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

如果你是一个Android开发者,你一定听说过Retrofit,一个著名的web请求框架。它以注释的形式展示了网络请求的方式,大大提高了代码的可读性,同时将网络请求写在一个接口中,提高了代码的可维护性。此外,如Dagger , GreenDao,ButterKnife等也是大量运营了注解。为什么这些知名的开源项目如此青睐注解?

在使用注释之前,xml被广泛用于描述原始数据,但是在使用xml的时间越来越长之后,开发人员意识到使用xml太耦合了。所以在java5中.0的版本,注解(Annotation)出现了。目前xml和Annotation一起使用,发挥各自的长处。我们如何使用注释?事实上,注释使用起来非常简单。一个定制注释可以由java指定的四个原始注释来描述这四个原注释分别是:@Documented @Retention @Target @Inherited 。

@Documented -表示是否将注解信息添加在java文档中。

@Retention -定义该注解的生命周期。

RetentionPolicy.SOURCE – 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。 RetentionPolicy.CLASS – 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。 RetentionPolicy.RUNTIME– 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。

@Target -表示该注解用于什么地方。如果不明确指出,该注解可以放在任何地方。以下是一些可用的参数。需要说明的是:属性的注解是兼容的,如果你想给7个属性都添加注解,

仅仅排除一个属性,那么你需要在定义target包含所有的属性。

ElementType.TYPE:用于描述类、接口或enum声明 ElementType.FIELD:用于描述实例变量 ElementType.METHOD ElementType.PARAMETER ElementType.CONSTRUCTOR ElementType.LOCAL_VARIABLE ElementType.ANNOTATION_TYPE 另一个注释 ElementType.PACKAGE 用于记录java文件的package信息

@Inherited -定义该注释和子类的关系

话不多说我们来实战一下。在我们开始写项目的时候通常都会封装一个BaseActivity,每个面向界面的Activity中都会指向一个xml 界面文件,也就是Activity 与 xml是绑定关系的。这样我们的注解就能派上用场了,我们可以通过注解将xml 绑定到对应的Activity中。一个Activity类中绑定一个layout 那么我们的注解描述类型就是TYPE。这个绑定效果一定是作用到运行时的,所以有了如下代码。

 @Retention(RetentionPolicy.RUNTIME)

 @Target(ElementType.TYPE)

 @Documented

 public @interface BindLayout {

 @LayoutRes

 int value();
 
 }

我们通过反射获取到这个注解中传入的xml数据,将他绑定在Activity中。代码如下:

 private static void bindActivityLayout(Activity activity) {

 Class aClass = activity.getClass();

 BindLayout annotation = (BindLayout) aClass.getAnnotation(BindLayout.class);

 if (annotation != null) {

             activity.setContentView(annotation.value());

 ButterKnife.bind(activity);

 }

 }

我们只要在Activity中的OnCreate初始化一下,就能够轻松实现绑定。

@BindLayout(R.layout.activity_xx)

public class XXActivity extends Activity {
 
@Override

 protected void onCreate() {

 MoBind moBind = new MoBind();

        moBind.bindActivity(this);
 
 }

...
 
}

比较正确的做法是将绑定方法放入BaseActivity中,让我们的子类继承于他,这样一对一的关系变的简洁明了。当然,不只只是这样,你可以开发新的用途,例如,我们需要在界面中绑定其他View做一下操作,比如显示一个空的界面或者显示一个自定义的Dialog。

通过注解,也可以快速的绑定,还记得我们的原注解Targe可以修饰一个变量,于是绑定一个其他View在Activity中就可以这么做:

 @Retention(RetentionPolicy.RUNTIME)

 @Target(ElementType.FIELD)

 @Documented

 public @interface BindOthersView {

 @LayoutRes int value();

 }

我们一样通过反射调用:

 private static void bindActivityView(Activity activity) {

 Field[] declaredFields = activity.getClass().getDeclaredFields();

 if (declaredFields != null && declaredFields.length > 0) {

 for (Field f : declaredFields) {

 BindOthersView annotation = f.getAnnotation(BindOthersView.class);

 if (annotation != null) {

 View inflate = LayoutInflater.from(activity).inflate(annotation.value(), null);

 if (inflate != null) {

 try {

                             f.setAccessible(true);

                             f.set(activity, inflate);

 } catch (IllegalAccessException e) {

                             e.printStackTrace();

 }

 }

 }

 }

 }
 
 }

我们只需要在BaseActivity中的OnCreate 中初始化一次,就可以在它的子类中随意绑定其他View(代码中已经做了初始化,请放心使用)。

@BindOthersView(R.layout.empty_view)

View emptyView;

怎么样,实现起来是不是非常简单,总结起来就是三个步骤,定义注解,解析注解,使用注解。快去定义你自己的注解,让你的代码变得简洁且逼格满满吧。

最后,关于Android基础架构设计的更多知识,可参考私信小编获取。

Android基础架构设计核心—注解的使用详解

由于篇幅限制,只能展示大致的内容。详细文档可以点击这里Android基础必备核心知识点获取。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/118785.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!