RoboGuice 簡介
RoboGuice
是一個框架,它使用 Google 自己的 Guice 庫為 Android 帶來了 Dependency Injection 的簡單性和易用性。
RoboGuice 3 減少了你的應用程式程式碼。程式碼越少意味著錯誤的機會越少。它還使你的程式碼更容易理解 - 不再是你的程式碼充斥著 Android 平臺的機制,但現在它可以專注於你的應用程式獨有的實際邏輯。
為了給你一個想法,看看這個典型的 Android Activity
的簡單例子:
class AndroidWay extends Activity {
TextView name;
ImageView thumbnail;
LocationManager loc;
Drawable icon;
String myName;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
name = (TextView) findViewById(R.id.name);
thumbnail = (ImageView) findViewById(R.id.thumbnail);
loc = (LocationManager) getSystemService(Activity.LOCATION_SERVICE);
icon = getResources().getDrawable(R.drawable.icon);
myName = getString(R.string.app_name);
name.setText( "Hello, " + myName );
}
}
這個例子是 19 行程式碼。如果你正在嘗試閱讀 onCreate()
,則必須跳過 5 行樣板初始化才能找到唯一真正重要的內容:name.setText()
。複雜的活動最終可能會有更多的這種初始化程式碼。
將此與使用 RoboGuice
編寫的同一個應用程式進行比較:
@ContentView(R.layout.main)
class RoboWay extends RoboActivity {
@InjectView(R.id.name) TextView name;
@InjectView(R.id.thumbnail) ImageView thumbnail;
@InjectResource(R.drawable.icon) Drawable icon;
@InjectResource(R.string.app_name) String myName;
@Inject LocationManager loc;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
name.setText( "Hello, " + myName );
}
}
RoboGuice 的目標是使你的程式碼與你的應用程式相關,而不是通常需要在 Android 中維護的所有初始化和生命週期程式碼。
註釋:
@ContentView 註釋:
@ContentView 註釋可用於進一步減輕活動的開發並替換 setContentView 語句:
@ContentView(R.layout.myactivity_layout)
public class MyActivity extends RoboActivity {
@InjectView(R.id.text1) TextView textView;
@Override
protected void onCreate( Bundle savedState ) {
textView.setText("Hello!");
}
}
@InjectResource 註釋:
首先,你需要一個繼承自 RoboActivity 的 Activity。然後,假設 res / anim 資料夾中有動畫 my_animation.xml,現在可以使用註釋引用它:
public class MyActivity extends RoboActivity {
@InjectResource(R.anim.my_animation) Animation myAnimation;
// the rest of your code
}
@Inject 註釋:
確保你的活動從 RoboActivity 擴充套件,並使用 @Inject 註釋你的系統服務成員。Roboguice 將完成剩下的工作。
class MyActivity extends RoboActivity {
@Inject Vibrator vibrator;
@Inject NotificationManager notificationManager;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// we can use the instances directly!
vibrator.vibrate(1000L); // RoboGuice took care of the getSystemService(VIBRATOR_SERVICE)
notificationManager.cancelAll();
除了檢視,資源,服務和其他特定於 Android 的東西,RoboGuice 還可以注入 Plain Old Java Objects。預設情況下,Roboguice 會在你的 POJO 上呼叫無引數建構函式
class MyActivity extends RoboActivity {
@Inject Foo foo; // this will basically call new Foo();
}