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