android annotation(二)

將Application類注入其他類中

since AndroidAnnotation 2.1

你可以使用@App在其他類中進行Application類的注入

@EActivity
public class MyActivity extends Activity {

  @App
  MyApplication application;

}

在其他使用了註解的組件中同樣可以起作用,譬如這個使用了@EBean的Bean中:

@EBean
public class MyBean {

  @App
  MyApplication application;

}

since AndroidAnnotation 3.0,Application類中必須強制以@EApplication進行註解。

加強Custom classes(一般類)

since AndroiAnnotation2.4

1、加強一般類

通過註解@EBean,你能在一個非標準android組建中使用註解。

栗子:

@EBean
public class MyClass {

}

需要注意的是,使用了@EBean註解的類的構造方法中要麼沒有構造參數(空構造方法),要麼只能有一個Context類型的構造參數。

2、在已經註解的類中使用該註解

你需要使用@Bean:

@EBean
public class MyOtherClass {

  @Bean
  MyClass myClass;

}

注意到,你能在其他類中繼續使用MyOtherClass:

@EActivity
public class MyActivity extends Activity {

  @Bean
  MyOtherClass myOtherClass;

}

除非被@EBean註解的類是singleton(單例),否則每次通過@Bean註解的都是一個新的實例對象。

需要注意的是,該註解生成的子類是final的,這表示,該類不能被繼承。但是,你可以爲你繼承了原類的子類進行註解。這適用於所用的註解。

舉個栗子:

@EActivity
public class MyChildActivity extends MyActivity {

}

3、爲指定的成員屬性註解

since AndroidAnnotation 2.5

如果你希望在某個註解的類中使用某個接口的實現類那麼你可以這樣使用:

@EActivity
public class MyActivity extends Activity {

    /* A MyImplementation instance will be injected. 
     * MyImplementation must be annotated with @EBean and implement MyInterface.
     */
    @Bean(MyImplementation.class)
    MyInterface myInterface;

}

栗子中,通過對myInterface註解,並傳入一個MyImpletation.class,能夠生成一個

myInterface=new MyImpletation

這樣的實現類的實例對象。

這樣的好處是實現瞭解耦。注重於針對interface進行編程。

4、支持的註解

你能在被@EBean註解的類中進行大多數AA annotation類的注入。

@EBean
public class MyClass {

  @SystemService
  NotificationManager notificationManager;

  @UiThread
  void updateUI() {

  }

}

5、和View相關的註解的使用

你能夠使用能View相關的註解。

@EBean
public class MyClass {

  @ViewById
  TextView myTextView;

  @Click(R.id.myButton)
  void handleButtonClick() {

  }

}

需要注意的是:依賴於Myclass的android組件中的ContentView中必須要有myTextViewmyButton,這樣才能起作用。

6、注入root context

當你希望將依賴於@EBean的android根組件注入時,使用@RootContext註解,請注意,你注入的Context的類型是否正確。

@EBean
public class MyClass {

  @RootContext
  Context context;

  // Only injected if the root context is an activity
  @RootContext
  Activity activity;

  // Only injected if the root context is a service
  @RootContext
  Service service;

  // Only injected if the root context is an instance of MyActivity
  @RootContext
  MyActivity myActivity;

}

在下面的MyActivity中,上面的Service的實例值是null。

@EActivity
public class MyActivity extends Activity {

  @Bean
  MyClass myClass;

}

7、在注入結束之後執行代碼

在類中使用了註解,並不意味着已經進行實例注入了(還沒實例化)。如果你希望在依賴注入結束之後進行代碼的執行,請使用@AfterInject註解。

@EBean
public class MyClass {

  @SystemService
  NotificationManager notificationManager;

  @Bean
  MyOtherClass dependency;

  public MyClass() {
    // notificationManager and dependency are null
  }

  @AfterInject
  public void doSomethingAfterInjection() {
    // notificationManager and dependency are set
  }

}

8、警告

如果父類和子類中相同名稱方法均使用了@AfterViews,@AfterInject,@AfterExtras註解,那麼,將會出現bug,在issue #591尋找更多的細節吧!

9、使用域

since AndroiAnnotation 2.5

AndroidAnnotations現階段支持在兩種域使用:

  • 默認類型:每次一個bean注入的時候生成一個新的實例;
  • 單例類型:只有第一次纔會創建,下面每次使用都會重複使用該實例。
@EBean(scope = Scope.Singleton)
public class MySingleton {

}

注意點:

  • 如果你希望使用Singleton域,那麼建議加在contetx.getApplicationContext().之所以這樣是因爲該context在整個app中聲明週期最長,不容易造成內從泄露。
  • 在使用Singleton域聲明的@EBean中進行View的注入和View的事件綁定是不允許的,理由如上,容易出現內存泄露。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章