Roboguice 提供了對Context 生命周期相關的事件的send 和receive ,系統預設支持的事件為:
- OnActivityResultEvent
- OnConfigurationChangedEvent
- OnContentChangedEvent
- OnContentViewAvailableEvent
- OnCreateEvent
- OnDestroyEvent
- OnNewIntentEvent
- OnPauseEvent
- OnRestartEvent
- OnResumeEvent
- OnStartEvent
- OnStopEvent
一個簡單的例子如下:
public class MyActivity extends RoboActivity {
// You must "register" your listener in the current
// context by injecting it.
// Injection is commonly done here in the activity,
//but can also be done anywhere really.
@Inject protected MyListeners myListeners;
}
// In this example, all the listeners are in a
// MyListeners class, but really they could
// be anywhere as long as it's registered.
// You can even put the listeners directly into
// your activity classes if you like!
class MyListeners {
// Any method with void return type and a
// single parameter with @Observes annotation
// can be used as an event listener.
//This one listens to onResume.
public void doSomethingOnResume(
@Observes OnResumeEvent onResume ) {
Ln.d("Called doSomethingOnResume in onResume");
}
// As you might expect, some events can
//have parameters. The OnCreate event
// has the savedInstanceState parameter that
//Android passes to onCreate(Bundle)
public void doSomethingElseonCreate(
@Observes OnCreateEvent onCreate ) {
Ln.d("onCreate savedInstanceState is %s",
onCreate.getSavedInstanceState())
}
// And of course, you can have multiple
//listeners for a given event.
// Note that ordering of listener execution
//is indeterminate!
public void xxx( @Observes OnCreateEvent onCreate ) {
Ln.d("Hello, world!")
}
}
有關Events的注意事項如下:
- 在Context中使用@Inject定義事件的Listener.
- Event只能在某一特定的Context(Activity)中傳送,不能跨Context發送,接受。
- Event除了提供上面列出的Context相關事件外,也可以使用自定義的事件。
- @observes 只能應用到方法上,而不能應用到構造函數上。
下面使用一個自定義事件MyEvent,通過observer 這個自定義事件來發送,接收自定義事件。
public class EventDemo extends RoboActivity {
@Inject protected EventManager eventManager;
@InjectView (R.id.button) Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.eventdemo);
button.setOnClickListener(mGoListener);
}
private OnClickListener mGoListener = new OnClickListener()
{
public void onClick(View v)
{
eventManager.fire(EventDemo.this,new MyEvent());
}
};
protected void handleEvent(@Observes MyEvent event){
Toast.makeText(this, "Custom event",
Toast.LENGTH_LONG).show();
}
}
class MyEvent{
//put any memeber you want here.
}
本例下載