AndroidAnnotations 是如何工作的
(2014年2月 By Hiperion)
AndroidAnnotations工作在一个非常简单的方式。它会使用标准的Java注解处理工具自动添加一个额外的编译步骤生成的源代码。(译者注:即生成一个原有类名加“_”的类,这个类才是真正运行用的类)
源代码是什么样子的?
例如每个使用@EActivity注解的activity,将生成这个activity的一个子类,它的名字是在activity名称末尾追加一个下划线。
例如,下面的类:
package com.some.company;
@EActivity
publicclassMyActivityextends Activity{
// ...
}
将生成以下子类,在同一个包路径中,但在另一个源文件夹:(译者注:在测试过程中,并未在src目录下发现生成的类。但此类确实生成了,它在哪里呢?实际是在项目根目录的.apt_generated文件夹下,在eclipse中无法查看到,需要到资源管理其相应文件夹中查看。)
packagecom.some.company;
publicfinalclassMyActivity_extendsMyActivity{
// ...
}
该子类重载一些方法(例如的onCreate()),通过委托方式调用了你的activity的相关方法。这就是为什么你必须在AndroidManifest.xml文件中为你的activity名称添加“_”的原因:
<activityandroid:name=".MyListActivity_"/>
在原始的Android开发中,你通常是这样启动activity的:
startActivity(this,MyListActivity.class);
然而,如果使用AndroidAnnotations,真正被启动的activity是MyListActivity_:
startActivity(this,MyListActivity_.class);
1.AndroidAnnotations2.4及以上版本
我们提供了一个静态的助手方法,让你启动真正的activity:
// 启动 activity
MyListActivity_.intent(context).start();
// 创建一个intent使用 activity
Intentintent=MyListActivity_.intent(context).get();
// 你也可以设置flags
MyListActivity_.intent(context).flags(FLAG_ACTIVITY_CLEAR_TOP).start();
//你甚至可以在activity中使用@Extra定义扩展数据并作为activity的启动参数
MyListActivity_.intent(context).myDateExtra(someDate).start();
2.AndroidAnnotations2.7及以上版本
你还可以使用startActivityForResult()方法:
MyListActivity_.intent(context).startForResult();
在原始的Android开发中,你通常是这样启动一个服务的:
startService(this,MyService.class);
然而,如果使用AndroidAnnotations,则真正的服务MyService_将被启动:
startService(this,MyService_.class);
1.AndroidAnnotations2.7及以上版本
我们提供了一个静态的方法,让你启动生成的service:
// 启动service
MyService_.intent(context).start();
// 通过service创建一个intent
Intentintent=MyService_.intent(context).build();
// 你能在启动service时使用flags
MyService_.intent(context).flags(Intent.FLAG_GRANT_READ_URI_PERMISSION).start();
简短的回答是没有。更多关于可查看常见问题。
现在你已经学习了基础知识,让我们再来看看如何让Activities更加强大。
AndroidAnnotations是由Pierre-Yves Ricau创建,由eBusinessInformations赞助。
(注:本文阐述的只是它的工作方式,揭示了AndroidAnnotations是如何处理我们使用注解方式编写的代码。并不是你的代码要这样写)