1. 程式人生 > >Annotation註解詳細介紹

Annotation註解詳細介紹

目錄介紹

  • 1.Annotation庫的簡單介紹
  • [email protected]和@NonNull
  • 3.資源型別註釋
  • 4.型別定義註釋
  • 5.執行緒註釋
  • 6.RGB顏色紙註釋
  • 7.值範圍註釋
  • 8.許可權註釋
  • 9.重寫函式註釋
  • 10.返回值註釋
  • [email protected]註釋
  • [email protected]註解
  • 13.其他

1.Annotation庫的簡單介紹

  • 包含一系列有用元註釋,幫助開發者在編譯期間發現可能存在的bug
  • 是屬於Support Lib其中之一,獨立jar包
  • 通過註釋來完善自身程式碼質量
  • 官方文件:
    • AndroidAnnotations是一個能讓你進行快速開發的開源框架,它讓你關注真正重要的地方,它可以簡化你的程式碼,並且有利於你後期的維護
  • 庫的特點
    • 依賴注入(Dependency injection):支援view, extras, system service, resource等等
    • 簡單的執行緒模型(Simplified threading model):進行方法註解以讓該方法在UI執行緒或後臺執行緒進行執行
    • 事件繫結(Event binding):進行方法註解以讓方法執行view的時間而不用再新增一些監聽
    • REST client:建立一個介面,AndroidAnnotations用來實現
    • 沒有神祕感(No magic):AndroidAnnotations在編譯時會產生一個子類,你可以檢視子類中的程式碼來知道它是如何工作的.
    • 編譯檢測:提供的多種註解,用於檢測程式碼編譯時可能存在的異常,並給開發者相關提示,提高程式碼質量
    • AndroidAnnotations來實現這些美好的功能,只需要不到150kb的大小
  • 相關文件給出說明

[email protected] 和 @NonNull

  • 說明:
    • 檢測引數或者方法返回值是否可以為null,這是該框架中最常用也是最基礎的註解之一了,使用了這兩個註解,在Android Studio中,如果出現程式碼不安全的情況下,會給出智慧提示
  • @Nullable作用於函式引數或者返回值,標記引數或者返回值可以為空
  • @NonNull作用於函式引數或者返回值,標記引數或者返回值不可以為空
  • @NonNull使用舉例【千萬別忽視黃色警告-----這個淡黃色警告實際開發中很容易忽視】
  • 未加註釋:
    • image
  • 添加註釋:
    • image
    • 結論:可以看到加上的@NonNull註解後,AndroidStudio會自動檢測不安全的程式碼並給出友好提示,提示開發者進行修改
  • @Nullable 使用舉例
    • image
    • 結論:將@Nullable作用在方法上,這樣方法的返回值是允許為null的,但是可能會導致某些情況下的crash;

3.資源型別註釋

  • 在我們平時開發中我們肯定會經常用到引用一些資源,比如圖片資源及字串資源或者顏色值資源,因為這些資源的型別都是int值,所以有時候我們在給TextView設定字串資源時也有可能引用了圖片資源ID,就會導致有問題,比如會出現以下異常:
    • android.content.res.Resources$NotFoundException: String resource ID #0x3039
  • 資源通常是以整型值表示的,儲存在R.Java文章中。如果傳入資源值不對,那麼編譯器不會報錯,但是執行期會報錯。而註解可以避免這個問題。
  • 資源型別註解主要都有哪些?
    • @StringRes : 表示引數、變數或者函式返回值應該是一個字串型別的資源
    • @ColorInt : 表示引數、變數或者函式返回值應該是一個顏色值而不是顏色資源引用,例如應該是一個 AARRGGBB 的整數值。
    • @ColorRes : 表示引數、變數或者函式返回值應該是一個 color 型別的資源,而不是顏色值。注意和 ColorInt 區別
    • @AnimRes : 表示引數、變數或者函式返回值應該是一個 Anim 型別的資源
    • @DrawableRes : 表示引數、變數或者函式返回值應該是一個 drawable 型別的資源
    • @DimenRes : 表示引數、變數或者函式返回值應該是一個 dimension 型別的資源
  • 舉例子: 這裡定義了一個方法,方法中只接受@StringRes註解的int引用
    • 沒有添加註釋前
    • image
    • 添加註釋後
    • image
    • 結論:添加註釋可以在編譯器就找到錯誤

5.執行緒註釋

  • 執行緒註解主要是用於檢測一個函式是否在指定型別的執行緒中執行
  • 型別
    • @UiThread:標記執行在UI執行緒,一個UI執行緒是Activity執行所在的主視窗,對於一個應用而言,可能存在多個UI執行緒。每個UI執行緒對應不同的主視窗。
    • @MainThread:標記執行在主執行緒,一個應用只有一個主執行緒,主執行緒也是@UiThread執行緒。通常情況下,我們使用@MainThread來註解生命週期相關函式,使用@UiThread來註解檢視相關函式,一般情況下@MianThread和@UiThraed是可以互換的。
    • @WorkerThread:標記執行在後臺執行執行緒。
    • @BinderThread:標記執行在Binder執行緒
  • 舉例子
    public void threadtest(){ 
        new Thread(new TimerTask() { 
            @Override 
            public void run() { 
                setTest(); 
            } 
        }).start(); 
    } 
    
    @UiThread 
    public void setTest(){ 
        test.setText("測試"); 
    }
    那麼上面會報錯。提示:不做執行緒切換,只起到提示作用!
    

6.RGB顏色紙註釋

  • 在資源型別註解中我們使用@ColorRes來標記引數型別需要傳入顏色型別的id,而使用@ColorInt註解是標記引數型別需要傳入RGB或者ARGB顏色值的整型值。
  • 舉例子,閱讀TextView原始碼中的setTextColor方法
    • image

7.值範圍註釋

  • 當函式引數的取值在一定範圍時,可以使用註解來防止呼叫者傳入錯誤的引數,主要註解有三種。
  • 第一種
    @Size:對於類似陣列、集合和字串之類的引數,我們可以使用@Size註解來表示這些引數的大小。
    用法:
    @Size(min=1)//可以表示集合不可以為空
    @Size(max=23)//可以表示字串最大字元個數為23
    @Size(2)//表示陣列元素個數為2個
    @Size(multiple=2)//可以表示陣列大小是2的倍數
    
  • @IntRange:引數型別是int或者long,用法如下
    public void setInt(@intRange(from=0,to=255)){...}
    
  • @FloatRange:引數型別是float或者double,用法如下
    public void setFloat(@FloatRange(from=0.0,to=1.0)){...}
    
  • 舉個例子
    • @FloatRange 用法
      • image
    • @Size用法
      • image
    • 陣列只能有2個元素: @Size(2)
      • image

8.許可權註釋

  • Android應用在使用某些系統功能時,需要在AndroidManifest,xml中宣告許可權,否則在執行時就會提示缺失對應的許可權,為了在編譯時及時發現許可權的缺失,我們可以使用@RequiresPermission註解。
  • 如果需要一個許可權則加註解。
    @RequiresPermission(Manifest.permission.SET_WALLPAPER)
    
  • 如果需要一個集合至少一個許可權,那麼就加註解。
    @RequiresPermission(anyOf = {Manifest.permission.SET_WALLPAPER,Manifest.permission.CAMERA})
    
  • 如果同時需要多個許可權,那麼就加註解。
    @RequiresPermission(allOf = {Manifest.permission.SET_WALLPAPER,Manifest.permission.CAMERA})
    
  • 對於Intent呼叫所需許可權的ACTION字串定義處添加註解。
    @RequiresPermission(android.Manifest.permission.BLUETOOTH)
    String ACTION_REQUEST_DISCOVERRAVLE = "android.bluetooth.adapter.REQUEST_DISCOVERRAVLE";
    
  • 對於ContentProvider所需許可權,可能有讀和寫兩個操作。對應不同的許可權。
    @RequiresPermission.Read(@RequestPermission(READ_HISTORY_BOOLMARKS))
    @RequiresPermission.Write(@RequestPermission(WRITE_HISTORY_BOOLMARKS))
    public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks);
    

9.重寫函式註釋

  • 如果API允許重寫某個函式,但是要求在重寫該函式時需要呼叫super父類的函式。
  • 可以加註解@CallSuper來提示開發者。若是重寫不呼叫super就會報錯
  • 舉例子
    • image

10.返回值註釋

  • 該註解是為了檢測方法返回值是否是需要使用的,如果沒有被使用,則AndroidStudio會給出警告提示
  • @CheckResult使用案例
  • 添加註釋:
    • image

[email protected]註釋

  • @keep是用來標記在Proguard混淆過程中不需要混淆的類或者方法。在混淆時一些不需要混淆的會使用
    -keep class com.foo.bar{public static <method>}
    
  • 有了@Keep之後,就可以在編碼時標註出一些不需要混淆的類或者方法

[email protected]註解

  • 這個註解在原始碼裡是隨處可見,其實它的用法很簡單,就是對一些警告資訊的過濾。
  • 原始碼
    • image
  • 這個註解是可以使用在屬性、方法、構造方法、變數等等。那麼它的引數就是一個字串陣列。可以單個,可以多個。
  • 示例
    * @SuppressWarnings("unchecked")
    告訴編譯器忽略 unchecked 警告資訊,如使用List,ArrayList等未進行引數化產生的警告資訊。
    * @SuppressWarnings("serial")
    如果編譯器出現這樣的警告資訊:The serializable class WmailCalendar does not declare a static final serialVersionUID field of type long
    使用這個註釋將警告資訊去掉。
    * @SuppressWarnings("deprecation")
    如果使用了使用@Deprecated註釋的方法,編譯器將出現警告資訊。
    使用這個註釋將警告資訊去掉。
    * @SuppressWarnings("unchecked", "deprecation")
    告訴編譯器同時忽略unchecked和deprecation的警告資訊。
    * @SuppressWarnings(value={"unchecked", "deprecation"})
    等同於@SuppressWarnings("unchecked", "deprecation")
    

13.其他

  • @EActivity、@ViewById、@Click
  • 這三個註解應該是對我們的程式碼簡潔性最有幫助的
    • @EActivity : 後面需要跟上一個layout id,來標示該Activity所載入的xml佈局,這樣原來的onCreate()方法就不用寫了;
    • @ViewById : 與findViewById作用一致,而且@ViewById後面可以不寫控制元件id,前提是控制元件變數名要與控制元件id一致
    • @Click : 也就是控制元件的點選事件,而且如果控制元件ID與方法名一致,後面就不用寫控制元件ID了. 該註解可以單獨寫,也可以對多個Button合併寫
  • 程式碼案例
    //這裡加註解就可以不寫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(); 
        } 
    } 
    

關於其他內容介紹

01.關於部落格彙總連結

02.關於我的部落格