AndroidAnnotations框架詳解

簡介

在之前的開發中,你肯定用到了xUtilsButterKnife等依賴注入框架,你可以使用這些框架來簡化你的代碼,因爲很多代碼都是重複性的,對於老司機來說,你肯定不想浪費大量的時間在寫一些重複性的東西,比如findViewById之類的代碼,所以好的框架的使用對於快速開發來說是很有必要的,今天要聊得就是開源框架AndroidAnnotations,先看一下官方介紹:

AndroidAnnotations is an Open Source framework that speeds up Android development. It takes care of the plumbing, and lets you concentrate on what’s really important. By simplifying your code, it facilitates its maintenance.

Fast Android Development. Easy maintainance

我們來翻譯一下:

AndroidAnnotations是一個能讓你進行快速開發的開源框架,它讓你關注真正重要的地方,它可以簡化你的代碼,並且有利於你後期的維護;

快速開發,簡單可維護

這就是AndroidAnnotations, 一款讓你用了就停不下來的快速開發易維護的開源框架,ok,下面就跟着我的腳步,一起來揭開它的神祕面紗…

特點及環境配置

在官方首頁中,給出了一個例子,使用前和使用後的對比,我們會發現代碼減少了一半,可見其的強大,給出首頁地址:點我,當然既然是開源的,也少不了GitHub項目地址:點我

使用這個框架的特點:

  1. 依賴注入(Dependency injection):支持view, extras, system service, resource等等
  2. 簡單的線程模型(Simplified threading model):進行方法註解以讓該方法在UI線程或後臺線程進行執行
  3. 事件綁定(Event binding):進行方法註解以讓方法執行view的時間而不用再添加一些監聽
  4. REST client:創建一個接口,AndroidAnnotations用來實現
  5. 沒有神祕感(No magic):AndroidAnnotations在編譯時會產生一個子類,你可以查看子類中的代碼來知道它是如何工作的.
  6. 編譯檢測:提供的多種註解,用於檢測代碼編譯時可能存在的異常,並給開發者相關提示,提高代碼質量
  7. AndroidAnnotations來實現這些美好的功能,只需要不到150kb的大小

環境配置

在AndroidStudio中,你只需在build.gradle中加入一行編譯即可:

dependencies {
    compile ‘com.android.support:support-annotations:23.3.0’
}

當然,如果你的項目中已經使用了V7包,就可以直接使用了,是不是很簡單…

使用

@Nullable 和 @NonNull

檢測參數或者方法返回值是否可以爲null,這是該框架中最常用也是最基礎的註解之一了,使用了這兩個註解,在Android Studio中,如果出現代碼不安全的情況下,會給出智能提示,我們下面進行示例對比:

使用@NonNull註解修飾的參數不能爲null,在下面的例子,我們有一個彈出name的函數,該函數需要保證傳入的參數不能爲null,我們來看一下對比:

未加註解:

加上@NoNull註解

我們可以看到加上的@NonNull註解後,Android Studio會自動檢測不安全的代碼並給出友好提示,提示開發者進行修改;當然如果我們改成@Nullable就不會出現提示了;

我們也可以將@Nullable作用在方法上,這樣方法的返回值是允許爲null的,但是可能會導致某些情況下的crash;

@CheckResult

該註解是爲了檢測方法返回值是否是需要使用的,如果沒有被使用,則AndroidStudio會給出警告提示,下面進行示例對比:

未加註解:

加上@CheckResult註解

@EActivity、@ViewById、@Click

這三個註解應該是對我們的代碼簡潔性最有幫助的

  • @EActivity : 後面需要跟上一個layout id,來標示該Activity所加載的xml佈局,這樣原來的onCreate()方法就不用寫了;
  • @ViewById : 與findViewById作用一致,而且@ViewById後面可以不寫控件id,前提是控件變量名要與控件id一致
  • @Click : 也就是控件的點擊事件,而且如果控件ID與方法名一致,後面就不用寫控件ID了. 該註解可以單獨寫,也可以對多個Button合併寫

我們現在寫一個Activity是如何使用AndroidAnnotation框架的

import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import android.widget.Toast;

import com.googlecode.androidannotations.annotations.Click;
import com.googlecode.androidannotations.annotations.EActivity;
import com.googlecode.androidannotations.annotations.ViewById;

//這裏加註解就可以不寫onCreate方法
@EActivity(R.layout.activity_test_annotation)
public class TestAnnotation extends AppCompatActivity {

    @ViewById(R.id.tv_name)//如果變量名和控件ID一致,後面就不用寫id
    TextView tv_name;

    @Click(R.id.showName)//如果控件ID與方法名一致,後面就不用寫id
    public void showName(){
        Toast.makeText(this,tv_name.getText(),Toast.LENGTH_SHORT).show();
    }
}


我們來看如果有多個Button的點擊事件該怎麼寫

@Click({R.id.bt1,R.id.bt2,R.id.bt3})  
void buttonClicked(Button bt){  
    switch(bt.getId()){  
    case R.id.bt1:  
        break;  
        ...  
    }  
}  

注意:如果控件ID與變量名一致,在@ViewById後沒有寫控件ID, 則在使用時就不能直接在showName方法中調用,因爲在運行時會報一個空指針,所以需要在AfterView註解的方法中進行使用

@AfterView  
void init(){  
    tv_name.setText("Hello");  
}

資源引用類型註解

在我們平時開發中我們肯定會經常用到引用一些資源,比如圖片資源及字符串資源或者顏色值資源,因爲這些資源的類型都是int值,所以有時候我們在給TextView設置字符串資源時也有可能引用了圖片資源ID,就會導致有問題,比如會出現以下異常:

android.content.res.Resources$NotFoundException: String resource ID #0x3039

而在代碼檢測的時候我們自己卻很難發現,現在有了資源類型註解,這些問題都不再是問題了,我們先看一下資源類型註解主要都有哪些:

  • @StringRes : 表示參數、變量或者函數返回值應該是一個字符串類型的資源

  • @ColorInt : 表示參數、變量或者函數返回值應該是一個顏色值而不是顏色資源引用,例如應該是一個 AARRGGBB 的整數值。

  • @ColorRes : 表示參數、變量或者函數返回值應該是一個 color 類型的資源,而不是顏色值。注意和 ColorInt 區別

  • @AnimRes : 表示參數、變量或者函數返回值應該是一個 Anim 類型的資源

  • @DrawableRes : 表示參數、變量或者函數返回值應該是一個 drawable 類型的資源

  • @DimenRes : 表示參數、變量或者函數返回值應該是一個 dimension 類型的資源

我們下面進行代碼示例對比,我們這裏定義了一個方法,方法中只接受@StringRes註解的int引用

未加註解前:

加了註解後:

如果我們改爲 R.string.app_name, 提示就會自動消失:

我們可以看到,AndroidStudio已經給了我們提示,這樣我們再也不怕引用錯誤了;

線程註解

線程註解主要是用於檢測一個函數是否在指定類型的線程中執行,有四種註解類型;

  • @UiThread

  • @MainThread

  • @WorkerThread

  • @BinderThread

其中@UiThread 和 @MainThread 在大部分的使用場景中,是可以替換使用的,如果一個類中的所有方法都在同一個線程中執行,就直接可以在類本身進行註解;

對於代碼示例,已AsyncTask最爲合適不過,我們都知道doInBackground方法爲WorkThread,不可以進行UI更新,所以如果在onProgressUpdate方法外進行UI更新的話,IDE就會給我們直接的提示:

值約束註解 @FloatRange,@IntRange, @Size

@FloatRange 用法

如果在定義的方法中,需要傳的參數是一個Float或者Double類型,而且又需要保證值在一定範圍內,就可以使用 @FloatRange 註解,如圖所示,如果設置範圍爲0.0~1.0,如果傳值爲12,IDE就會直接給出提示:

@IntRange用法

當然,你也可以對int值進行約束限定,比如限定爲0~255,如果傳值300,就會報出錯誤提示:

這些都是非常有用的,因爲有的API限制傳值爲0~1,有的爲0~255,有了這個註解限制,就不用怕在代碼中傳入了錯誤的參數;

@Size用法

對於數據,集合及字符串我們可以用@Size進行限制,用法如下:

  • 字符串最常爲10: @Size(max=10)

  • 數組只能有2個元素: @Size(2)

  • 集合不能爲空,至少有一個元素: @Size(min=1)

權限註解: @RequiresPermission

如果我們的方法需要某些權限,但是又不知道在清單文件中是否配置了,我們就可以使用這個權限註解;

方法所需權限註解

 @RequiresPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
    public void writeInfo(String name){
        //TODO what you want
    }

如果需要多個權限的一個,使用 anyOf 屬性:

@RequiresPermission(anyOf={Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE}) 
public void writeInfo(String name){
//TODO what you want
}

如果需要使用多個權限,使用 allOf 屬性:

@RequiresPermission(allOf = {Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE}) 
public void writeInfo(String name){
//TODO what you want
}

intent權限註解

如果是intent的權限,我們可以在定義的intent常量上標註權限需求:

@RequiresPermission(Manifest.permission.BLUETOOTH)
    public static final String ACTION_VIEW = "android.bluetooth.adapter.action.REQUEST_DISCOVERABLE";

Content Provider 權限註解

對於content providers的權限,可以用@Read或者@Write標註每一個權限需求:

@RequiresPermission.Read(@RequiresPermission(READ_HISTORY_BOOKMARKS))
@RequiresPermission.Write(@RequiresPermission(WRITE_HISTORY_BOOKMARKS))
public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks");

Keep權限註解

相信我們每個打包的小夥伴都知道,如果想keep某個類裏面的某個方法是一件多麼痛苦的事情,你曾經在Proguard用到過類似這樣的代碼:

-keep class com.foo.bar { public static }

使用註解就會很方便的接軍這些問題,AndroidAnnotations將會告訴Proguard不要對指定的函數或者類進行優化操作:

@Keep
public void setAnni(@IntRange(from=0, to=255) int anni){
    //TODO what you want
}

注意: 根據官方文檔,目前該註解並沒有加入到Gradle插件中,我們就繼續等待吧…

好了,到此我們對於AndroidAnnotatios開源框架有了一定的瞭解,下面就盡情的去使用吧,這些只是框架中的一部分,更多好玩兒有趣的功能等待我們自己去發掘,希望大家都有美好的一天,生活不易,我們要好好珍惜…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章