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();
}