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