androidannotations的使用——适合新手

最近新入职一家公司,公司的项目中使用了androidannotations,于是花了些时间查看github,然后整理出以下资料。

androidannotations是一个提升开发速度的开源框架,它可以节约出时间,让你专注于真正重要的事情;同时,通过简化你的代码,也可以便于后期的维护。

首先,我们来看看AndroidAnnotations使用前和使用后的两端代码。

Before

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());
  }

}

After

@Fullscreen
@EActivity(R.layout.bookmarks)
@WindowFeature(Window.FEATURE_NO_TITLE)
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(@Path String search, @Path String userId);
 
}

从上面的天后两端代码可以看出,使用androidannotations框架后,代码明显简洁了很多,让人一目了然。

看到上面的效果,相信你迫不及待地要了解androidannotations的用法了吧?下面我就介绍下androidannotations的简单用法,谈到开源框架的使用,首先当然要先配置,那么androidannotations是如何配置呢?

  • 首先,在项目下的build.gradle中添加以下配置
    buildscript {
        repositories {
          mavenCentral()
        }
        dependencies {
            // replace with the current version of the Android plugin
            classpath 'com.android.tools.build:gradle:2.3.0'
        }
    }
    
    repositories {
        mavenCentral()
        mavenLocal()
    }
  • 其次,在module下的build.gradle中添加以下配置
    def AAVersion = "4.3.0" 
    dependencies {
        annotationProcessor "org.androidannotations:androidannotations:$AAVersion"
        compile "org.androidannotations:androidannotations-api:$AAVersion"
    }

    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.2"
        
        defaultConfig {
            minSdkVersion 9
            targetSdkVersion 25
        }
    }
    
其中,AAVersion定义了androidannotations最新版本号,在依赖中秩序应用这个变量即可,当然你也可以直接在依赖中填写版本号。

基本配置我们已经弄好了,那么,接下来,我们就需要将androidannotations应用到我们的项目中

  • 首先,创建一个activity

     import android.app.Activity;
     import android.widget.EditText;
     import android.widget.TextView;
     
     import org.androidannotations.annotations.Click;
     import org.androidannotations.annotations.EActivity;
     import org.androidannotations.annotations.ViewById;
     
     @EActivity(R.layout.main)
     public class MyActivity extends Activity {
     
         @ViewById(R.id.myInput)
         EditText myInput;
            
         @ViewById(R.id.myTextView)
         TextView textView;
             
         @Click
         void myButton() {
              String name = myInput.getText().toString();
              textView.setText("Hello "+name);
         }
     }
    
  • 布局文件

     <?xml version="1.0" encoding="utf-8"?>
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:orientation="vertical"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         >
         <EditText  
             android:id="@+id/myInput"
             android:layout_width="fill_parent" 
             android:layout_height="wrap_content" 
             />
         <Button  
             android:id="@+id/myButton"
             android:layout_width="fill_parent" 
             android:layout_height="wrap_content" 
             android:text="Click me!"
             />        
         <TextView  
             android:id="@+id/myTextView"
             android:layout_width="fill_parent" 
             android:layout_height="wrap_content" 
             />    
     </LinearLayout>
    
  • AndroidMainfest.xml文件中声明activity,但是activity不在是像以前直接写类名,而是必须在类名后加上""后缀,因为,当我们编译运行的时候,as会自动生成一个MainActivity的子类MainActivity,实际上工作的类也是这个类。(生成的类在as中是看不到的,可以在电脑上项目路径下的build目录中找到)

     <activity android:name=".MainActivity_">
         <intent-filter>
             <action android:name="android.intent.action.MAIN" />
    
             <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
     </activity>
    

注:startActivity的时候,也不能直接用MainActivity,而应用该清单文件中声明的也就是加上后缀名的Activity,也就是加上后缀名的Activity,在2.4以及以后的版本后,我们也可以使用以下代码来实现跳转activity

    // Starting the activity
    MyListActivity_.intent(context).start();
    
    // Building an intent from the activity
    Intent intent = MyListActivity_.intent(context).get();
    
    // You can provide flags
    MyListActivity_.intent(context).flags(FLAG_ACTIVITY_CLEAR_TOP).start();
    
    // You can even provide extras defined with @Extra in the activity
    MyListActivity_.intent(context).myDateExtra(someDate).start();

从上面的讲解中,我们应该可以看出androidannotations的特点,归纳起来就是以下五点:

  • 依赖注入:可以注入view,service,activity,resource

     @EActivity
     public class MyActivity extends Activity {
       // ...
     }
    
  • 简化线程模型:可以在方法上注释为ui线程或者background线程

     void myMethod() {
         someBackgroundWork("hello", 42);
     }
     
     @Background
     void someBackgroundWork(String aParam, long anotherParam) {
         [...]
     }
    
  • 事件绑定:注释方法来操作view的时间,而不在需要匿名listener类

     @Click(id=)   
     void myButton() {
         String name = myInput.getText().toString();
         textView.setText("Hello "+name);
     }
    
  • 轻松的客户端:创建一个客户端接口,androidannotations会生成实现类

  • 可见:在androidannotations生成子类的时候,你可以去产看代码来观察它是如何工作。

到这,我们大概了解了android的基本使用方法,当然这只是最初步的使用,想要了解更多androidannotations的使用方法,请点击下面链接:
androidannotations的更多使用方法
项目地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容