Android Annotations框架详解

下载地址:https://github.com/excilys/androidannotations/wiki/Download

官网:http://androidannotations.org/

文档介绍:https://github.com/excilys/androidannotations/wiki


一、Android Annotations的原理以及和主流注解框架的比较

目前主流的注解框架有xUtils、ButterKnife、Dragger和Roboguice,它们的实现原理都是一致的,都是通过反射机制实现的。通过在Runtime运行期去反射类中带有注解的Field和Method,然后再去执行注解相对应的逻辑代码。大家都知道反射机制是在APP的运行期执行的,会造成执行的效率下降,执行时间变长的缺点。当在我们APP中大量的使用基于反射的注解,会严重影响到性能,但是AA的实现的逻辑并不是基于此。

AA工作的原理其实也很简单,它通过使用jdk 1.6引入的Java Annotation Processing Tool,在编译器中加了一层额外的自动编译步骤,用来生成基于你源码的代码。生成的代码是你源码的直接子类,而且自动生成的类的名称就是父类名称后面加个下划线。比如使用了@EActivity注解的MyActivity,AA都会自动帮你生成一个名为MyActivity_的类。使用AA的注解在编译期间就已经自动生成了对应的子类,运行期运行的其实就是这个子类,所以说AA的使用不会给APP的执行性能造成负面影响。


二、Android Annotations的工程配置

压缩包里包含两个jar文件:androidannotations-x.x.x.jar(xxxx\androidannotations-develop\examples\HelloWorldEclipse\compile-libs\androidannotations-x.x.x.jar)和androidannotations-api-x.x.x.jar(xxxxx\androidannotations-develop\examples\HelloWorldEclipse\libs\androidannotations-api-3.2.jar),androidannotations-x.x.x.jar是用来提供给java的注解处理插件,androidannotations-api-x.x.x.jar是给android工程使用的包。

新建一个工程,并建好如图的包

接着就是像上次我配置butterknife注解那样配置,链接:http://blog.csdn.net/pcaxb/article/details/46890331

只需要配置compile-libs里面的Jar就可以了,然而你要是把libs里面的也配置进去的也是没有问题的。

eclipse中使用androidannotations的配置方法说明:https://github.com/excilys/androidannotations/wiki/Eclipse-Project-Configuration

Android Studio中配置AndroidAnnotations:http://www.th7.cn/Program/Android/201407/233348.shtml


三、深入Android Annotations是如何工作的

AndroidAnnotations的工作方式很简单,它使用标准的java注入处理工具,自动添加了一个额外的编译步骤来生成源代码。每一个增强的类,比如每一个用@EActivity注入的Activity,会自动生成一个以该类类名+下划线为类名的该Activity子类。

比如下面这个类:

package com.some.company;
@EActivity
public class MyActivity extends Activity {
  // ...
}
将会生成下面这个子类,他们在同一个包下面但处在不同的文件夹:
package com.some.company;
public final class MyActivity_ extends MyActivity {
  // ...
}
这个子类通过复写一些方法(比如onCreate())来为你的activity增加一些行为。上面介绍的这些就是你在AndroidManifest.xml生命Acitivty时需要为你的类名后面增加一个下划线的原因。

启动一个使用注入的Activity:在Android中,我们通常会通过如下的方式来启动一个activity:

startActivity(this, MyListActivity.class);
然而,如果使用AndroidAnnotations的话,真正被启动的activity是MyListActivity_而不是MyListActivity:
startActivity(this, MyListActivity_.class);

Intent Builder(AndroidAnnotations 2.4及以上):
我们提供了一个静态的帮助类来启动编译生成的activity:
// Starting the activity
MyListActivity_.intent(context).start();

// Building an intent from the activity
Intent intent = MyListActivity_.intent(context).get();

// You can provide flags
MyListActivity_.intent(context).flags(FLAG_ACTIVITY_CLEAR_TOP).start();

// You can even provide extras defined with @Extra in the activity
MyListActivity_.intent(context).myDateExtra(someDate).start();

在AndroidAnnotations 2.7及以上的版本中你可以使用另一个启动Activity的方法startActivityForResult()了 :
MyListActivity_.intent(context).startForResult();

启动一个使用注解的服务:
在Android中,我们通常通过如下的方式来启动一个服务:
startService(this, MyService.class);
然而,如果使用AndroidAnnotations的话,真正被启动的Service是MyService_而不是MyService:
startService(this, MyService_.class);

Intent Builder(AndroidAnnotations 2.7及以上版本):
我们提供了一个静态的帮助类来启动生产的Service:
// Starting the service
MyService_.intent(context).start();

// Building an intent from the activity
Intent intent = MyService_.intent(context).build();

// You can provide flags
MyService_.intent(context).flags(Intent.FLAG_GRANT_READ_URI_PERMISSION).start();

四、Android Annotations 的简单实用

1.组件的注解

@EActivity这个注解是用来修饰Activity的,向Activity注入布局,也可以设置页面的样式为全屏、无Title。这些使用具有实意的注解来实现,是不是很方便呀。对于其他的组件支持也是相当简单的,如@EService、@EReceiver、@EProvider、@EApplication、@EApplication、@EFragment。同时也能修饰自定义控件,注解为@EView、@EViewGroup。支持是不是相当全面。

2.资源引用的注解

有了AA,各种让人烦躁的findViewById从此一去不再返了,你可以简单的使用@ViewById去绑定布局里面的控件,如果你的变量名和控件的id值一致,连id的指向也可省去。而且在注解中不写id的情况下,如果编译器在R文件中找不到对应变量id名的时候,编译器也会给你提示,很是友好。

同时你要是想在成员变量中引用资源的话,只要在变量上加入对应的注解修饰就可以了,同样的如果变量名称和资源id一致的时候,id就可省去。支持所有的资源文件,所有的。

如果你想获取系统服务,只要在你的变量前加上@SystemService注解。

获取Intent中传递的值,加上@Extra注解,同时容错性很好,如果接收不到这个key对应的value,也没问题,你可以设置默认值。再有就是强转失败也不会造成crash,比如传递的是个int值,接收的时候是个String,也没有问题,只是接收失败罢了。

很强大有木有,修饰成员变量的注解主要用来解决它们初始化的问题,做到声明即初始化,拿来即可用的功能。还有很多属性,就不一一介绍了。

3.事件绑定注解


AA支持基本所有的原生事件的绑定,示例中展示的是常见的三种。简单的一个事件注解加上一个监听的控件id,就能完成以前要做的复杂的事件绑定呀,内部类实现呀等。而且方法名可以任意定制,如果方法名与控件的id一致,注解中的id也可省去,同样如果匹配不上的话,编译器也编译不过的。方法的参数列表也是可以自定义的,当需要参数的时候,就把原生监听方法的参数列表拉过来就可以直接使用了。其他常用的还有@TextChange、@ItemClick、@SeekBarProgressChange。

4.异步线程与UI线程的交互


当View相关的成员变量初始化完毕后,会调用拥有@AfterViews注解的方法,你可以在里面初始化一些界面控件等。如果其他的成员变量处事完毕,就会调用@AfterInject。

比如大多数应用的逻辑是这样的,初始化界面之后,就发起耗时的数据请求,然后解析获取到的数据,再设置到界面上。一般的涉及UI线程与异步任务交互的时候,相对都比较麻烦一些。让我们看下AA是如何实现的。

很简单吧,UI线程执行的方法加个@UiThread,异步线程方法加个@Background,两者的交互就是方法直接的相互调用,其他的你不用关心,一切的实现都是AA的编译器去自动生成交互的代码。交互的过程,完全没有在执行异步的感觉,不用再使用Handler去发送接收Message了。两个注解就把以前一堆的代码实现的功能给实现了,真心给个最大的赞。

5.Rest API

在AA中也支持Rest API,而且支持所有的HTTP请求方法。下面演示的是一个GET请求。

定义一个请求的接口,然后就可以直接使用了,不需要自己再去实现。这个跟公司后台接口设计紧密相关,如果你公司接口交互都是Rest风格的话,你就重写下,好好体验AA的魅力吧。

详细的使用链接: http://blog.csdn.net/pcaxb/article/details/46891481

最近对比了很多的注解框架,看了很多的资料,发现这个是最好用的,分享给大家。可怜

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值