將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中必須要有
myTextView
和myButton
,這樣才能起作用。
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的事件綁定是不允許的,理由如上,容易出現內存泄露。