一、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
四、参考文档: