RoboGuice是依赖注入型的注解工具,还有一种编译器型的注解工具ButterKnife,可以参考这篇文章。
Robo(Fragment)Activity的onCreate方法中启动注入,在调用super.onCreate()方法后即可使用
RoboFragment的onCreate方法中启动注入非view对象,onViewCreate方法(onCreateView设置布局后立马调用)中启动view对象注入,在调用super.onViewCreate方法后即可使用
在上述页面各个生命周期方法中执行EventManager的fire方法来开始执行event注入
普通java类field在构造函数完成后注入,构造函数的参数在构造函数期间自动注入
继承Robo(Fragment)Activity,在类上面写@ContentView(布局id)
继承RoboFragment,布局还得在onCreateView里用inflater加载
在声明控件前写@InjectView(id)
@InjectView(R.id.btn)
Button button;
在资源前写@InjectResource(id),会自动调用getResource的方法获取并赋值
@InjectResource(R.anim.xxx) Animation animation;
String,drawable等资源类似。
在声明前写@Inject,会自动判断是否是系统服务,是的话调用getSystemService获取相应的系统服务
@Inject Vibrator v;
Notification,Wifi,GPS等类似。
在类声明前加@Inject会默认调用空构造方法创建对象
在某个构造方法上面加@Inject,则会调用该构造方法创建对象
构造方法里的参数也会按照注解规则创建新对象当作参数
field也可以通过@Inject来注解java对象,会在当前类对象创建完后(构造器调用后)才会去创建 (扫描)注解的field
由3,4可知,构造器注解时参数被同样注解化(需要参数类型是可被注解的)创建使用;field注解时,在构造器里field还没被创建,不可使用
外层类如果没用到注解,则内部的field也不会用到注解了,因为没有开启注解的语句
在类上面加@Singleton,则@Inject的该java类在整个app中只有一个实例,且不会被回收直到应用结束
在类上面加@ContextSingleton,则@Inject的该java类在创建他的context中只有一个实例,且不会被回收直到该context结束生命周期
直接new的对象不会调用注入
继承RoboService,在onCreate里会执行注入,之后可使用注入对象
继承BroadcastReceiver,重写handleReceive方法进行业务(onReceive方法里执行注入且调用handleReceive方法,所以不用重写onReceive类(已置为final))
Ln.v()/d()/w()等。
继承view类,在各个构造函数里加载完布局后调用注入方法
RoboGuice.getInjector(getContext()).injectMembers(this)
重写View.onFinishInflate()方法,该方法执行时,注入对象可以使用
写一个返回值为void,参数为一个@Observes注解的类的方法,比如系统提供的OnResumeEvent等周期方法,则在相应生命周期方法内会执行注入,调用该方法,和接口作用类似。
exa:当RoboActivity执行注入时(onCreate里),在onResume方法里会用EventManager对象fire一个OnResumeEvent实例对象,并会调用以该类作为参数的方法并传入对象
public class MyActivity extends RoboActivity{
public void doSomethingOnResume(@Observes OnResumeEvent onResume){}
}
这些方法可以直接写在类(context)中,也可以单写一个类,但是此时需要在context里@Inject该类的实例才会执行注解。
exa:@Inject该类的实例才会执行注解
public class MyActivity extends RoboActivity{
@Inject MyEventListener listener;
}
class MyEventListener{
public void doSomethingOnResume(@Observes OnResumeEvent onResume){}
}
自定义event类,需要声明@Inject EventManager这个单例的event管理者,然后在想触发的位置调用eventManager.fire(新的类实例),就会调用以该类做参数的event方法。
exa:触发处调用fire即可。
public class MyActivity extends RoboActivity{
@Inject EventManager manager;
…
manager.fire(new OnCustom());
…
public void doSomethingOnCustom(@Observes OnCustom onCustom){}
}
class OnCustom{}
系统提供了很多event类,大部分声明周期的相应方法都有:
OnActivityResultEvent
OnConfigurationChangedEvent
OnContentChangedEvent
OnContentViewAvailableEvent
OnCreateEvent
OnDestroyEvent
OnNewIntentEvent
OnPauseEvent
OnRestartEvent
OnResumeEvent
OnStartEvent
OnStopEvent