首页 > 代码库 > AndroidAnnotations使用说明书—简介

AndroidAnnotations使用说明书—简介

一、AndroidAnnotations是什么:

        AndroidAnnotations是一个利用注解方式来简化代码结构,提高开发效率的开源框架,类似开源框架还有:roboguice 、butterknife 、dagger 等。

        AndroidAnnotations的目标是使Android应用程序易于开发和维护,而它使用的主要手段是通过注解减少代码量来实现这个目标。

        开发者可以通过注解来表明自己的意图,然后AndroidAnnotations会在程序编译的时候生成和意图对应的代码。

AndroidAnnotations的特征如下:

       依赖注入:注入views, extras, system services, resources等等;

         简化线程模型:通过注解你的方法可以让他们在UI线程或者后台线程执行;

         事件绑定:通过注解你的方法可以让它来处理视图的监听事件,让你远离丑陋的匿名监听器内部类;

         REST client:创建一个客户端接口,AndroidAnnotations生成实现;

        没有魔法:AndroidAnnotations在编译的时候生成与意图对应的代码,你可以检查代码,看看它是如何工作的

          androidannotations提供这么多简化代码的功能,但jar包还不到50KB,并且在运行时对程序性能没任何影响


         下面是实现同一功能的两段代码,一个是我们通常看到的代码,另外一个是使用AndroidAnnotations后的代码:

没有使用AndroidAnnotations时:

<span style="font-size:18px;">public class BookmarksToClipboardActivity extends Activity {
  
  BookmarkAdapter adapter;
 
  ListView bookmarkList;
 
  EditText search;
 
  BookmarkApplication application;
 
  Animation fadeIn;
 
  ClipboardManager clipboardManager;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(FLAG_FULLSCREEN, FLAG_FULLSCREEN);
 
    setContentView(R.layout.bookmarks);
 
    bookmarkList = (ListView) findViewById(R.id.bookmarkList);
    search = (EditText) findViewById(R.id.search);
    application = (BookmarkApplication) getApplication();
    fadeIn = AnimationUtils.loadAnimation(this, anim.fade_in);
    clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
 
    View updateBookmarksButton1 = findViewById(R.id.updateBookmarksButton1);
    updateBookmarksButton1.setOnClickListener(new OnClickListener() {
 
      @Override
      public void onClick(View v) {
        updateBookmarksClicked();
      }
    });
 
    View updateBookmarksButton2 = findViewById(R.id.updateBookmarksButton2);
    updateBookmarksButton2.setOnClickListener(new OnClickListener() {
 
      @Override
      public void onClick(View v) {
        updateBookmarksClicked();
      }
    });
 
    bookmarkList.setOnItemClickListener(new OnItemClickListener() {
 
      @Override
      public void onItemClick(AdapterView<?> p, View v, int pos, long id) {
        Bookmark selectedBookmark = (Bookmark) p.getAdapter().getItem(pos);
        bookmarkListItemClicked(selectedBookmark);
      }
    });
 
    initBookmarkList();
  }
 
  void initBookmarkList() {
    adapter = new BookmarkAdapter(this);
    bookmarkList.setAdapter(adapter);
  }
 
  void updateBookmarksClicked() {
    UpdateBookmarksTask task = new UpdateBookmarksTask();
 
    task.execute(search.getText().toString(), application.getUserId());
  }
  
  private static final String BOOKMARK_URL = //
  "http://www.bookmarks.com/bookmarks/{userId}?search={search}";
  
  
  class UpdateBookmarksTask extends AsyncTask<String, Void, Bookmarks> {
 
    @Override
    protected Bookmarks doInBackground(String... params) {
      String searchString = params[0];
      String userId = params[1];
 
      RestTemplate client = new RestTemplate();
      HashMap<String, Object> args = new HashMap<String, Object>();
      args.put("search", searchString);
      args.put("userId", userId);
      HttpHeaders httpHeaders = new HttpHeaders();
      HttpEntity<Bookmarks> request = new HttpEntity<Bookmarks>(httpHeaders);
      ResponseEntity<Bookmarks> response = client.exchange( //
          BOOKMARK_URL, HttpMethod.GET, request, Bookmarks.class, args);
      Bookmarks bookmarks = response.getBody();
 
      return bookmarks;
    }
 
    @Override
    protected void onPostExecute(Bookmarks result) {
      adapter.updateBookmarks(result);
      bookmarkList.startAnimation(fadeIn);
    }
    
  }
 
  void bookmarkListItemClicked(Bookmark selectedBookmark) {
    clipboardManager.setText(selectedBookmark.getUrl());
  }
 
}</span>

使用AndroidAnnotations后:

<span style="font-size:18px;">@NoTitle
@Fullscreen
@EActivity(R.layout.bookmarks)
public class BookmarksToClipboardActivity extends Activity {
  
  BookmarkAdapter adapter;
  
  @ViewById
  ListView bookmarkList;
 
  @ViewById
  EditText search;
  
  @App
  BookmarkApplication application;
  
  @RestService
  BookmarkClient restClient;
 
  @AnimationRes
  Animation fadeIn;
  
  @SystemService
  ClipboardManager clipboardManager;
 
  @AfterViews
  void initBookmarkList() {
    adapter = new BookmarkAdapter(this);
    bookmarkList.setAdapter(adapter);
  }
  
  @Click({R.id.updateBookmarksButton1, R.id.updateBookmarksButton2})
  void updateBookmarksClicked() {
    searchAsync(search.getText().toString(), application.getUserId());
  }
  
  @Background
  void searchAsync(String searchString, String userId) {
    Bookmarks bookmarks = restClient.getBookmarks(searchString, userId);
    updateBookmarks(bookmarks);
  }
 
  @UiThread
  void updateBookmarks(Bookmarks bookmarks) {
    adapter.updateBookmarks(bookmarks);
    bookmarkList.startAnimation(fadeIn);
  }
  
  @ItemClick
  void bookmarkListItemClicked(Bookmark selectedBookmark) {
    clipboardManager.setText(selectedBookmark.getUrl());
  }
 
}
@Rest("http://www.bookmarks.com")
public interface BookmarkClient {
  
  @Get("/bookmarks/{userId}?search={search}")
  Bookmarks getBookmarks(String search, String userId);
 
}</span>

你会发现使用AndroidAnnotations后代码量大大减小了,还不到使用前代码量的一半,平常我们用到的findViewById、setOnClickListener、setContentView等等这类纯粹是耗体力劳动的代码,只需要在成员变量、方法或者类的顶部增加一句注解就搞定了,大大提高了咱们的工作效率。


二、如何使用AndroidAnnotations:

        下面以windows系统下使用Eclipse IDE为例:

        1、下载AndroidAnnotations:下载AndroidAnnotations

        2、解压AndroidAnnotations,你会发现有AndroidAnnotations和examples两个文件夹,我们只使用AndroidAnnotations文件夹里面的内容,不管examples,我们自己创建一个工程,因为由于每个人的eclipse环境配置不一样,在导入examples下的工程的时候,编译没问题,但运行的时候会出现异常;

        3、假定你已经在Eclipse中创建好了一个android工程,接下来就是为工程配置AndroidAnnotions,在你的工程目录下创建一个"libs"和"compile-libs"文件夹,然后把“androidannotations-X.X.X.jar”放到libs文件夹下,把“androidannotations-X.X.X-api.jar”文件放在compile-libs文件夹里,现在右键你的工程,选择“Properties”,会出现如下界面:



        4、选择"Java Compiler" ,确保 "Compiler compliance level"是“1.6”,否则处理器不会被激活;



        5、选择 "Java Compiler"—"Annotation Processing" 并选择"Enable annotation processing",如图:



        6、选择 "Java Compiler“—”Annotation Processing“—”Factory Path",然后做如下图所示的操作:



        7、切换到 "Java Build Path“ - ”Libraries",然后做如下图所示的操作(按照序号标识操作),有的同学可能不需要,因为高版本的ADT是支持自动将libs文件夹下的jar包加在这里面的:



        8、完成以上步骤,clean一下工程,现在你就可以使用AndroidAnnotions为你的代码增加注解啦。


三、简单示例:

        我整了一个示例工程,觉得配置麻烦的同学直接down下来吧。AndroidAnnotionsDemo


四、参考文档:

           AndroidAnnotions Wiki

           环境配置

AndroidAnnotations使用说明书—简介