Android RoboGuice 使用指南(19):发送接收Events

jerry Android 2015年08月24日 收藏

Roboguice 提供了對Context 生命周期相關的事件的send 和receive ,系統預設支持的事件為:

  • OnActivityResultEvent
  • OnConfigurationChangedEvent
  • OnContentChangedEvent
  • OnContentViewAvailableEvent
  • OnCreateEvent
  • OnDestroyEvent
  • OnNewIntentEvent
  • OnPauseEvent
  • OnRestartEvent
  • OnResumeEvent
  • OnStartEvent
  • OnStopEvent

一個簡單的例子如下:

  1. public class MyActivity extends RoboActivity {
  2. // You must "register" your listener in the current
  3. // context by injecting it.
  4. // Injection is commonly done here in the activity,
  5. //but can also be done anywhere really.
  6. @Inject protected MyListeners myListeners;
  7.  
  8. }
  9.  
  10.  
  11. // In this example, all the listeners are in a
  12. // MyListeners class, but really they could
  13. // be anywhere as long as it's registered.
  14. // You can even put the listeners directly into
  15. // your activity classes if you like!
  16. class MyListeners {
  17.  
  18. // Any method with void return type and a
  19. // single parameter with @Observes annotation
  20. // can be used as an event listener.
  21. //This one listens to onResume.
  22. public void doSomethingOnResume(
  23. @Observes OnResumeEvent onResume ) {
  24. Ln.d("Called doSomethingOnResume in onResume");
  25. }
  26.  
  27. // As you might expect, some events can
  28. //have parameters.  The OnCreate event
  29. // has the savedInstanceState parameter that
  30. //Android passes to onCreate(Bundle)
  31. public void doSomethingElseOnCreate(
  32. @Observes OnCreateEvent onCreate ) {
  33. Ln.d("onCreate savedInstanceState is %s",
  34. onCreate.getSavedInstanceState())
  35. }
  36.  
  37. // And of course, you can have multiple
  38. //listeners for a given event.
  39. // Note that ordering of listener execution
  40. //is indeterminate!
  41. public void xxx( @Observes OnCreateEvent onCreate ) {
  42. Ln.d("Hello, world!")
  43. }
  44. }

有關Events的注意事項如下:

  • 在Context中使用@Inject定義事件的Listener.
  • Event只能在某一特定的Context(Activity)中傳送,不能跨Context發送,接受。
  • Event除了提供上面列出的Context相關事件外,也可以使用自定義的事件。
  • @observes 只能應用到方法上,而不能應用到構造函數上。

下面使用一個自定義事件MyEvent,通過observer 這個自定義事件來發送,接收自定義事件。

  1. public class EventDemo extends RoboActivity {
  2.  
  3. @Inject protected EventManager eventManager;
  4. @InjectView (R.id.button) Button button;
  5.  
  6. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.eventdemo);
  10. button.setOnClickListener(mGoListener);
  11. }
  12.  
  13. private OnClickListener mGoListener = new OnClickListener()
  14. {
  15. public void onClick(View v)
  16. {
  17. eventManager.fire(EventDemo.this,new MyEvent());
  18. }
  19. };
  20.  
  21.  
  22. protected void handleEvent(@Observes MyEvent event){
  23. Toast.makeText(this, "Custom event",
  24. Toast.LENGTH_LONG).show();
  25. }
  26. }
  27.  
  28.  
  29. class MyEvent{
  30. //put any memeber you want here.
  31. }
  32.  

本例下載