細說 Android Annotations 註解框架

hahadelphi發表於2021-09-09

Hello 大家好,我是劉某人

註解不是必須的,但是能極大的幫助我們節約時間和提高開發效率,寫此篇文章的初衷,是我課程中的同學想要了解一下這個框架,遂寫下此篇文章,其實我們如果想了解Annotations這個框架的話,他的官方示例寫得還是比較詳細的:

官網:
文件:

如果你學習我的影片課程,哪怕課程之外的知識點,如果有時間,我也會幫助你提升的,授人予魚不如授人予漁,我時刻都在培養同學的思維邏輯,只要哪天開竅了,一切都變得簡單明瞭了。

推薦我的慕課網Android實戰課程,助你暴力提升Android技術。

相對於其他的註解框架,如XUtils、ButterKnife、Dragger等,Annotations的優勢在於沒有使用到反射,不影響效能,所以如果論效能,Annotations應該是最好的。

不過據說Google官方推出註解框架之後,Annotations的作者就不在更新了。

不過不得不說Annotations的配置要麻煩許多,所以我建議如果不是必須的話,這個還是少用一些,不然重構程式碼比較麻煩,當然,我現在說這些,對於沒有用過Annotations的同學來講,可能還不太理解,跟著我一起來看下吧。

首先我們來配置一下所需的Gradle,配置Gradle分為兩步,第一步是新增依賴

圖片描述

可以看到我定義了一個變數AAVersion來定義版本,第二步則是新增Java編譯的配置:

圖片描述

我們在defaultConfig節點中配置如上程式碼是因為Annotations的編譯不像其他框架一樣反射,而是透過生成一份子類程式碼來幫助執行,所以找不到清單檔案,我們自己配置下即可。

當然,這個時候還是無法執行的,上面說到Annotations的編譯是生成一份子類,所以我們的清單檔案也需要修改,在每一個宣告的類中加上下劃線,如下程式碼:

圖片描述

做完這些,我們的配置才OK,那麼接下來就看下我們怎麼使用吧。

Annotations對Android中一些重量級的元件都做了增加,我們來看下

1.Activity

首先是如何宣告一個Activity的View,傳統的寫法是setContentView,但是有了Annotations之後,我們可以使用@EActivity這個標籤

@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
    //Anything
}

2.Application

關於Appliation,是必須要使用@EApplication這個標籤的

@EApplication
public class BaseApp extends Application {
     //Anything
}

然後則是在清單檔案中註冊了,記得加上下劃線哦

圖片描述

如果想要使用的話,需要使用@App標籤

@App
BaseApp mApp;

具體的可以查閱Github wiki

3.Bean

關於實體類,我們可以使用@EBean

@EBean
public class JavaBean {
   //Anything
}

如果想要使用的話,需要使用@Bean標籤

@Bean
JavaBean mBean;

具體的可以查閱Github wiki

4.Fragment

關於Fragment就有意思了,首先我們需要使用@EFragment來註解,這個是沒問題的,和@EActivity的用法是一樣的

@EFragment(R.layout.fragment_main)
public class MainFragment extends Fragment {
   //Anything
}

這樣我們就不需要再呼叫onCreateView了,當然如果你想使用到onCreateView中的Bundle那麼你直接return null 即可,說完註解,我們再來說一下使用,使用是需要下劃線的,比如我們在xml中則是如下:

圖片描述

如果是在程式碼中,則可以使用下面兩種任選其一:

MainFragment mFragment = new MainFragment_();
//or
MainFragment mFragment = MainFragment_.builder().build();

5.Provider

內容提供者倒是沒什麼太大的區別,使用@EProvider註解即可。

6.BrocastReceiver

廣播的話分為動態廣播和靜態廣播,動態註冊最為簡單

@Receiver(actions = TEST_ACTION)
protected void test() {
    //收到廣播
}

我們可以看到只需要透過@Receiver註解標記需要接收的actions即可,而靜態廣播如下

@EReceiver
public class JavaReceiver extends BroadcastReceiver {

    //可以接收Context,Intent 兩個引數
    @ReceiverAction(actions = MainActivity.TEST_ACTION)
    void test() {
        //收到廣播
    }


    @Override
    public void onReceive(Context context, Intent intent) {
        //什麼都不用做
    }

這裡我們也是一樣的,我定義了一個test,並且你也可以自己傳遞上下文或者intent

7.Service

服務的話有兩個,一個IntentService和一個Service,我們先來看下IntentService

@EIntentService
public class MainIntentService extends IntentService {

    public MainIntentService() {
        super("MainIntentService");
    }

    @ServiceAction
    void myAction(String param) {
        //接收引數
    }

    @Override
    protected void onHandleIntent(Intent intent) {
         //什麼都不做
    }

程式碼很簡單,我們使用@EIntentService註解來標記,使用@ServiceAction註解來接收傳遞的引數,再來看下我們常見的Service,其實只是使用了@EService註解,我們具體看下他的啟動和停止的方法吧。

//啟動服務
MainService_.intent(this).start();
//停止服務
MainService_.intent(this).stop();

8.View

View的情況實際上也是兩種,一種是View,一種是ViewGroup,如果是View的話只需要@EView註解即可

圖片描述

當然,使用的方式也分兩種,xml或者程式碼,先看xml

<com.liuguilin.androidannotations.view.MyTextView_
    android:text="MyTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

xml包括清單檔案中一定要注意下劃線,在程式碼中可以這樣

MyTextView mTextView = MyTextView_.build(this);

如果是ViewGroup的話使用@ViewGroup(R.layout.xxx)

具體的可以查閱Github wiki

關於注入的註解關鍵字,其實上面已經有講到一些了,比如@App @Bean 等都是,我們繼續來看其他的基本操作

1.ViewById / ViewsById

這兩個都是負責初始化的,相信大家一眼就知道什麼意思,替代我們的findViewById

@ViewById(R.id.mTextView)
TextView mTextView;

@ViewsById({R.id.mTextView, R.id.mYourTextView})
List<TextView> mTextViews;

2.Extra

擴充套件屬性,常用於Intent的擴充套件,說白了就是intent的傳值,所以我們可以這樣使用,這裡我的案例是MainActivity跳轉FirstActivity,所以我們的FirstActivity可以這樣區寫:

@EActivity(R.layout.activity_first)
public class FirstActivity extends AppCompatActivity {

    @ViewById(R.id.tvFirst)
    TextView tvFirst;

    @Extra("Name")
    String mName;

    @AfterViews
    void initView() {
        tvFirst.setText(mName);
    }

可以看到程式碼還是很明朗的,我初始化了一個文字控制元件然後接受外部傳遞的mName設定給文字,那麼外部是如何呼叫的?

FirstActivity_.intent(this).mName("劉桂林").start();

一行程式碼即可。

3.AfterViews

我們如果使用ViewById初始化後,在onCreate使用這個物件你會發現是無法使用的,事實上這個時候還沒有初始化,AfterViews就是用來告知我們試圖已經初始化完成,我們標準的寫法是這樣的:

@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {

    @ViewById(R.id.mTextView)
    TextView mTextView;


    @AfterViews
    void init(){
        mTextView.setText("Hello");
    }

4.FragmentArg

顧名思義,這個是在Fragment中使用的,並且看名字就知道是什麼意思了,首先是@FragmentArg,這個註解和@Extra是一樣的,用來傳遞引數

MainFragment mFragment = MainFragment_
        .builder()
        .fragmentArg("Hello")
        .build();

至於 FragmentById / FragmentByTag 這些不常用的可以自行查閱wiki

5.FromHtml

假設你的strings.xml中有一個html的引數,那麼常見的做法是使用Html類去轉換成String再賦值給TextView,而使用@FromHtml則無需這麼複雜,我們來看下

<string name="hello_html"><![CDATA[Hello <b>World</b>!]]></string>

這是一段html,我們來載入

@ViewById(R.id.mTextView)
@FromHtml(R.string.hello_html)
TextView mTextView;

這樣即可。

6.NonConfigurationInstance

這也是個相對冷門的註解了,當我們的Config配置發生更改,比如切換語言的時候,我們的物件會銷燬重建,但是使用此註解可以儲存例項

7.SystemService

我們如果需要getSystemService初始化的系統服務都可以使用此註解免去這一個步驟。

1.Text 變化

如果我們要監聽EditText的輸入文字改變,則需要實現他的TextWatcher.onTextChanged介面,但是註解框架為我們提供了諸多方便的介面,如:

  • TextChange
  • BeforeTextChange
  • AfterTextChange

看如下程式碼:

@AfterTextChange(R.id.mEditText)
void afterTextChanged(Editable text) {
    //開始改變
}

@TextChange(R.id.mEditText)
void onTextChanges(CharSequence text, int before, int start, int count) {
    //正在改變
}

@BeforeTextChange(R.id.mEditText)
void beforeTextChanged(CharSequence text, int start, int count, int after) {
    //結束改變
 }

其中引數除了text其他的都是可選項

2.狀態 變化

狀態變化主要取決於焦點以及編輯狀態,還有選中,我們可以使用 @FocusChange @EditorAction @CheckedChange

3.事件 監聽

事件監聽就很多了,比如我們的點選事件,觸控事件,長按事件等

@Click(R.id.mClick)
void BttonClick() {
    //點選事件
}

@LongClick(R.id.mClick)
void BttonLongClick() {
    //長按事件
}

@Touch(R.id.mClick)
boolean BttonTouchClick(MotionEvent event) {
    //觸控事件
    return false;
}

當然,我們還有Adapter中的事件監聽,如 @ItemClick @ItemLongClick @ItemSelect

還有我們的menu其實也是可以這樣設定點選的,我們來看下如下程式碼

@OptionsMenu(R.menu.main)
@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {

    @OptionsItem(R.id.menu_help)
    void Help() {
        //Anything
    }
 }

這樣即可實現menu與menu的點選事件

4.SeekBar 監聽

以往我們監聽SeekBar是需要設定監聽的,現在不用啦。

@SeekBarTouchStart(R.id.mSeekBar)
void SeekBarTouchStart(SeekBar seekBar) {
    //觸控開始
}

@SeekBarProgressChange(R.id.mSeekBar)
void onProgressChangeOnSeekBar(SeekBar seekBar, int progress, boolean fromUser) {
    //觸控變化
}

@SeekBarTouchStop(R.id.mSeekBar)
void SeekBarTouchStop(SeekBar seekBar) {
    //觸控結束
}

5.按鍵 事件

按鍵共有四個

  • KeyDown 按下
  • KeyUp 抬起
  • KeyLongPress 長按
  • KeyMultiple 多按

6.ViewPager 監聽

ViewPager監聽以往是需要addPageListener的,現在提供了三個註解

  • PageScrollStateChanged
  • PageScrolled
  • PageSelected

1.後臺執行緒

我們如果想要在子執行緒中執行,以往都是new Thread().start的,現在只需要@Background

即可,它表示在主執行緒以外的執行緒執行

2.主執行緒

主執行緒也就是ui執行緒,我們使用@UiThread註解,代替 runUIThread方法

其他還有很多,我們來看下

  • InstanceState 儲存狀態
  • WindowFeature 視窗功能
  • Fullscreen 全屏
  • CustomTitle 自定義標題
  • InjectMenu 注入選單
  • OptionsMenu 選單
  • OptionsMenuItem 選單Item
  • OrmLiteDao 資料庫
  • RoboGuice
  • Trace 日誌條目
  • Transactional 資料庫事務任務
  • OnActivityResult Activity回撥
  • OnActivityResult.Extra Activit回撥擴充套件值
  • HierarchyViewerSupport
  • ServiceAction 服務訊號
  • Receiver 廣播
  • Receiver.Extra 廣播擴充套件值
  • ReceiverAction 廣播訊號
  • ReceiverAction.Extra 廣播訊號擴充套件值
  • IgnoredWhenDetached
  • IgnoreWhen
  • WakeLock 鎖屏
  • DataBound 資料繫結

  • StringRes 字串
  • AnimationRes 動畫
  • ColorRes 顏色
  • DimensionPixelOffsetRes 數字
  • DimensionPixelSizeRes 數字
  • DimensionRes 數字
  • BooleanRes 布林
  • ColorStateListRes 顏色狀態
  • DrawableRes 圖片
  • IntArrayRes 整型陣列
  • IntegerRes 整型
  • LayoutRes 佈局
  • MovieRes 電影
  • StringArrayRes 字串陣列
  • TextArrayRes 文字陣列
  • TextRes 文字
  • HtmlRes 網頁

到這裡,其實大部分常用的Api都已經有所講解了,不過在實際開發中可能還會有一些需要注意的事項,不過不用擔心,多看下wiki即可,國內的部落格領域比較凌亂,其實很難找到實用的東西,所以需要自己耐心一點,當然還有Rest Api ,Typesafe SharedPreferences,Preference API helpers 這些就不講了,感興趣的可以看下Github wiki,一法通萬法,掌握了學習知識的技巧,很多東西哪怕不瞭解,摸索一下也能快速上手的。

原始碼下載
連結:
密碼:t35a

推薦我的慕課網Android實戰課程,助你暴力提升Android技術。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2471/viewspace-2824447/,如需轉載,請註明出處,否則將追究法律責任。

相關文章