一、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>
<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:
下面以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
环境配置