android-annotations使用入门

转载请标明出处:http://write.blog.csdn.net/postedit/41577317

androidannotation是一个非常牛逼的框架(https://github.com/excilys/androidannotations/wiki),可以做到:依赖注入(Dependency Injection),简化的线程模型(Simplified  threading model),事件绑定(Event binding),REST Client。

非常好用,更重要的是它对性能无影响!本文我们简要的来看一下一些入门的东西。

1.从例子开始(参考https://github.com/excilys/androidannotations/wiki/FirstActivity):

AndroidManifest.xml

[html] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.hello"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk
  7. android:minSdkVersion="14"
  8. android:targetSdkVersion="18" />
  9. <application
  10. android:allowBackup="true"
  11. android:icon="@drawable/ic_launcher"
  12. android:label="@string/app_name">
  13. <activity
  14. android:name="com.example.hello.MainActivity_"
  15. android:label="@string/app_name" >
  16. <intent-filter>
  17. <action android:name="android.intent.action.MAIN" />
  18. <category android:name="android.intent.category.LAUNCHER" />
  19. </intent-filter>
  20. </activity>
  21. <activity android:name="com.example.hello.SecondActivity_" />
  22. </application>
  23. </manifest>

里面定义了两个activity,注意名字后面都带了一个下划线。

2.MainActivity.java:注意这里的名字没有下划线

[java] view
plain
copy

  1. @EActivity(R.layout.activity_main)
  2. public class MainActivity extends Activity {
  3. @ViewById(R.id.myInput)
  4. EditText myInput;
  5. @ViewById(R.id.myTextView)
  6. TextView textView;
  7. @ViewById(R.id.myButton2)
  8. Button btn2;
  9. @StringRes(R.string.go_to_second)
  10. String btn2Txt;
  11. @AfterViews
  12. protected void afterViews(){
  13. btn2.setText(btn2Txt);
  14. }
  15. @Click
  16. void myButton() {
  17. String name = myInput.getText().toString();
  18. textView.setText("Hello " + name);
  19. }
  20. @Click
  21. void myButton2(){
  22. SecondActivity_.intent(this).start();
  23. }
  24. }
  25. activity_main.xml
  26. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  27. xmlns:tools="http://schemas.android.com/tools"
  28. android:layout_width="match_parent"
  29. android:layout_height="match_parent"
  30. android:orientation="vertical" >
  31. <EditText
  32. android:id="@+id/myInput"
  33. android:layout_width="fill_parent"
  34. android:layout_height="wrap_content"  />
  35. <Button
  36. android:id="@+id/myButton"
  37. android:layout_width="fill_parent"
  38. android:layout_height="wrap_content"
  39. android:text="Click me!" />
  40. <TextView
  41. android:id="@+id/myTextView"
  42. android:layout_width="fill_parent"
  43. android:layout_height="wrap_content" />
  44. <Button
  45. android:id="@+id/myButton2"
  46. android:layout_width="fill_parent"
  47. android:layout_height="wrap_content"
  48. android:text="@string/go_to_second"/>
  49. </LinearLayout>

SecondActivity的源码就不贴了。

使用注入以后,代码看上去变得很简洁,再也没有那一大堆findViewById之类的了。

如何进行编译运行呢(参考https://github.com/excilys/androidannotations/wiki/CustomizeAnnotationProcessing):

(1)如果是使用javac,需要传递-AandroidManifestFile=/path/to/AndroidManifest.xml这个参数,指明Manifest文件。

(2)如果是使用Eclipse,在项目上点击右键->Properties->Java Compiler->Annotation Processing->Enable annotation processing,

然后在Factory Path中添加AndroidAnnotations的jar包。

(3)如果是使用maven,maven-compiler-plugin的3.1版本可以设置编译参数。

[html] view
plain
copy

  1. <plugin>
  2. <artifactId>maven-compiler-plugin</artifactId>
  3. <version>3.1</version>
  4. <configuration>
  5. <encoding>UTF-8</encoding>
  6. <source>1.6</source>
  7. <target>1.6</target>
  8. <compilerArgs>
  9. <arg>-Atrace=true</arg>
  10. <arg>-AlogLevel=trace</arg>
  11. <arg>-AlogConsoleAppender=true</arg>
  12. <arg>-AandroidManifestFile=/path/to/AndroidManifest.xml</arg>
  13. </compilerArgs>
  14. </configuration>
  15. </plugin>

所有的可用的参数如下:

(1)trace:boolean,用来启用或者禁用@Trace注解,这个注解用会通过log记录方法的执行。

(2)androidManifestFile:string,默认情况下,AndroidAnnotations会在它的父文件夹中递归查找AndroidManifest.xml,假如你的工程的结构比较特殊,可以用这个进行指定。

(3)resourcePackageName:string,默认情况下,AndroidAnnotations会从AndroidManifest.xml文件中提取应用的package来找到R文件,假如R文件是在一个定制的package中,可以用它来设置。

(4)logFile:string,从3.0开始,AndroidAnnotations使用自定义的logger来在记录代码执行过程中的日志。日志默认会写在{outputFolder}/androidannotations.log文件中。

{outputFolder}参数按照下面的顺序进行查找:target-> build -> bin -> root project folder。如果找不到{outputFolder},可以使用logFile指定输出的文件。{outputFolder}可以使用占位符来动态改变文件名。

(5)logLevel:string,enum(trace, debug, info, warn, error):默认的日志级别是DEBUG,改为TRACE可能会有用。

(6)logAppenderConsole:boolean,默认情况下,AndroidAnnotations会使用FileAppender和MessagerAppender2个日志appender,FileAppender会写在日志文件中,MessagerAppender在IDE的消息列表中显示。可以设置logAppenderConsole为true来启用另一个ConsoleAppender。

(7)threadControl:boolean,用来启用或者禁用@SupposeUiThread和@SupposeBackground注解,默认是true,可以保证方法是在正确的线程中调用。

3.对性能的影响

无影响!因为它的原理是生成Activity类的子类,并不是使用反射!我们可以看下编译器帮我们自动生成的activity:

[java] view
plain
copy

  1. public final class MainActivity_ extends MainActivity{
  2. @Override
  3. public void onCreate(Bundle savedInstanceState) {
  4. init_(savedInstanceState);//这里会处理@StringRes,@ColorRes等等
  5. super.onCreate(savedInstanceState);
  6. setContentView(layout.activity_main);//这里对应@EActivity(R.layout.activity_main)
  7. }
  8. private void init_(Bundle savedInstanceState) {
  9. Resources resources_ = this.getResources();
  10. btn2Txt = resources_.getString(string.go_to_second);
  11. }
  12. @Override
  13. public void setContentView(int layoutResID) {
  14. super.setContentView(layoutResID);
  15. afterSetContentView_();
  16. }
  17. @Override
  18. public void setContentView(View view, LayoutParams params) {
  19. super.setContentView(view, params);
  20. afterSetContentView_();
  21. }
  22. @Override
  23. public void setContentView(View view) {
  24. super.setContentView(view);
  25. afterSetContentView_();
  26. }
  27. private void afterSetContentView_() {
  28. //@ViewById
  29. textView = ((TextView) findViewById(id.myTextView));
  30. myInput = ((EditText) findViewById(id.myInput));
  31. btn2 = ((Button) findViewById(id.myButton2));
  32. //@Click
  33. {
  34. View view = findViewById(id.myButton2);
  35. if (view!= null) {
  36. view.setOnClickListener(new OnClickListener() {
  37. @Override
  38. public void onClick(View view) {
  39. MainActivity_.this.myButton2();
  40. }
  41. }
  42. );
  43. }
  44. }
  45. //@Click
  46. {
  47. View view = findViewById(id.myButton);
  48. if (view!= null) {
  49. view.setOnClickListener(new OnClickListener() {
  50. @Override
  51. public void onClick(View view) {
  52. MainActivity_.this.myButton();
  53. }
  54. }
  55. );
  56. }
  57. }
  58. afterViews();//这里调用了@AfterViews标注的afterViews()方法
  59. }
  60. public static MainActivity_.IntentBuilder_ intent(Context context) {
  61. return new MainActivity_.IntentBuilder_(context);
  62. }
  63. public static class IntentBuilder_ {//这个是给startActivity和startActivityForResult用的
  64. private Context context_;
  65. private final Intent intent_;
  66. public IntentBuilder_(Context context) {
  67. context_ = context;
  68. intent_ = new Intent(context, MainActivity_.class);
  69. }
  70. public Intent get() {
  71. return intent_;
  72. }
  73. public MainActivity_.IntentBuilder_ flags(int flags) {
  74. intent_.setFlags(flags);
  75. return this;
  76. }
  77. public void start() {
  78. context_.startActivity(intent_);
  79. }
  80. public void startForResult(int requestCode) {
  81. if (context_ instanceof Activity) {
  82. ((Activity) context_).startActivityForResult(intent_, requestCode);
  83. } else {
  84. context_.startActivity(intent_);
  85. }
  86. }
  87. }
  88. }

最后看一下完整的pom.xml的例子(https://github.com/excilys/androidannotations/blob/develop/examples/maveneclipse/pom.xml):

[html] view
plain
copy

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>org.androidannotations</groupId>
  5. <artifactId>maveneclipse</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>apk</packaging>
  8. <name>maveneclipse</name>
  9. <properties>
  10. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  11. <android.version>4.1.1.4</android.version>
  12. <android.platform>16</android.platform>
  13. <androidannotations.version>3.2</androidannotations.version>
  14. <java.version>1.6</java.version>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>com.google.android</groupId>
  19. <artifactId>android</artifactId>
  20. <version>${android.version}</version>
  21. <scope>provided</scope>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.androidannotations</groupId>
  25. <artifactId>androidannotations</artifactId>
  26. <version>${androidannotations.version}</version>
  27. <scope>provided</scope>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.androidannotations</groupId>
  31. <artifactId>androidannotations-api</artifactId>
  32. <version>${androidannotations.version}</version>
  33. </dependency>
  34. </dependencies>
  35. <build>
  36. <plugins>
  37. <plugin>
  38. <artifactId>maven-compiler-plugin</artifactId>
  39. <version>3.1</version>
  40. <configuration>
  41. <source>${java.version}</source>
  42. <target>${java.version}</target>
  43. <compilerArgs>
  44. <arg>-AlogLevel=trace</arg>
  45. </compilerArgs>
  46. </configuration>
  47. </plugin>
  48. <plugin>
  49. <groupId>com.jayway.maven.plugins.android.generation2</groupId>
  50. <artifactId>android-maven-plugin</artifactId>
  51. <version>3.9.0-rc.3</version>
  52. <configuration>
  53. <sdk>
  54. <platform>${android.platform}</platform>
  55. </sdk>
  56. <undeployBeforeDeploy>true</undeployBeforeDeploy>
  57. </configuration>
  58. <extensions>true</extensions>
  59. </plugin>
  60. </plugins>
  61. </build>
  62. </project>
时间: 2024-10-07 17:20:41

android-annotations使用入门的相关文章

使用Android Annotations开发

使用Android Annotations框架gradle配置1.修改Module下的build.gradle apply plugin: 'com.android.application' apply plugin: 'com.neenbedankt.android-apt' buildscript { repositories { mavenCentral() } dependencies { classpath 'com.neenbedankt.gradle.plugins:android

Android Wear 开发入门

大家好,我是陆嘉杰,我是一名Android开发者.我想和大家进行一些技术交流,希望越来越多的人能和我成为好朋友. 大家都知道,智能手表是下一个开发的风口,而这方面的技术又属于前沿,所以和大家分享下Android Wear的开发流程. 首先,我推荐大家使用Android Studio来进行Wear的开发,这也是谷歌推荐的,本次讲授过程也将以Android Studio作为开发集成环境进行. 下面我们来创建Android Wear项目. 请注意,Android Wear项目中同时包含mobile和w

Android Annotations开源框架学习 + eclipse(一)

1.下载 相关jar包 (下载地址:https://repo1.maven.org/maven2/org/androidannotations/androidannotations-bundle/3.3.1/androidannotations-bundle-3.3.1.zip) 2.配置eclipse 在libs下导入androidannotations-api-3.3.1.jar ,在eclipse项目中 新增compile-lib 文件夹,其中放置:androidannotations-3

Android jni 编程入门

本文将介绍如何使用eclipse和ndk-build来编写一个基于Android4.4版本的包含有.so动态库的安卓程序. 前提是已经安装和配置好了诸如SDK,NDK等编译环境.下面开始编程! 1 程序逻辑 我们要编写的程序包含两部分:java部分--负责界面和调用JNI native函数:JNI native 部分--负责native函数的具体实现(本文使用C语言). native 函数伪代码如下: ? 1 2 3 4 5 6 7 8 /* funtion: 传入两个整形变量,计算他们之和 r

Android 学习资料入门到精通(PDF集合)共54本

最近收集一些安卓入门到精通,包含游戏编程,网络编程,多媒体开发,需要学习朋友就下载保持下来,下载链接在最下面 下面是网盘内容 14天学会安卓开发_(完整版).pdf Android 4  游戏高级编程  第2版.pdf Android 4.4 SDK Reference(2014.1.12 by YGX).chm Android 4高级编程(第3版)(完整书签).pdf Android(经典实例).pdf Android_2.0游戏开发实战宝典.pdf Android_开发从入门到精通_IBM.

【FastDev4Android框架开发】RecyclerView完全解析之结合AA(Android Annotations)注入框架实例(三十)

(一).前言: 话说RecyclerView已经面市很久,也在很多应用中得到广泛的使用,在整个开发者圈子里面也拥有很不错的口碑,那说明RecyclerView拥有比ListView,GridView之类控件有很多的优点,例如:数据绑定,Item View创建,View的回收以及重用等机制.本系列文章会包括到以下三个部分: RecyclerView控件的基本使用,包括基础,进阶,高级部分,动画之类(点击进入) RecyclerView控件的实战实例(点击进入) RecyclerView控件集合AA

《Android开发从入门到精通》扶松柏.扫描版.pdf

下载地址:网盘下载 内容简介 编辑 <Android开发从入门到精通>系统讲解了Android软件开发的基础知识,图文并茂地帮助读者学习和掌握SDK.开发流程以及常用的API等.书中以讲述实战实例为导向,用一个个典型应用生动地引领读者进行项目开发实践.<Android开发从入门到精通>是一本内容翔实,理论实践紧密结合的教程. [1] 目录 编辑 第1章 走进Android世界 1.1 智能手机飞速发展 1.1.1 主流手机系统介绍 1.1.2 Android横空出世 1.2 And

android的简单入门学习

话说光配环境就整死我了, 不是说多么难, 是最近google被屏了, 很多sdk里面需要下载的东西都下不下来, 坑爹啊.  最后跟扫拉稀要了一个他配置好的,才运行了. android目录分析: assets 资产目录,存放文件,这些文件会被打包到应用程序的apk(安装包) bin 编译后的文件目录 gen 目录自动生成的目录 project.properties 代表编译的版本 target = "" 来修改编译版本 libs 支持jar包 会被添加到android depend 目录

Android与Libgdx入门实例

本文讲解如何实现Android与Libgdx各自的Hello World过程. 1. Android版Hello World 点击Eclipse快捷方式,选择New Android Application,创建project,填写相应名称. 2. 然后一路next,选择默认就ok了. 3. 创建的程序文件模型. 3. 修改界面显示字符串. 4. 选择工程,点击Run As-Android Application,即可. 若无android手机,可以创建模拟器. 选择Window-Android

Android 自定义控件开发入门(一)

作为一个有创意的开发者,或者软件对UI设计的要求比较高,你经常会遇到安卓自带的控件无法满足你的需求的情况,这种时候,我们只能去自己去实现适合项目的控件.同时,安卓也允许你去继承已经存在的控件或者实现你自己的控件以便优化界面和创造更加丰富的用户体验. 那么怎样来创建一个新的控件呢? 这得看需求是怎样的了. 1.需要在原生控件的基本功能上进行扩展,这个时候你只需要继承并对控件进行扩展.通过重写它的事件,onDraw ,但是始终都保持都父类方法的调用.如从已有的高级控件上继承,例如继承一个TextVi