Android RoboGuice使用

RoboGuice是依赖注入型的注解工具,还有一种编译器型的注解工具ButterKnife,可以参考这篇文章

一.注入顺序及使用地方:

  1. Robo(Fragment)Activity的onCreate方法中启动注入,在调用super.onCreate()方法后即可使用

  2. RoboFragment的onCreate方法中启动注入非view对象,onViewCreate方法(onCreateView设置布局后立马调用)中启动view对象注入,在调用super.onViewCreate方法后即可使用

  3. 在上述页面各个生命周期方法中执行EventManager的fire方法来开始执行event注入

  4. 普通java类field在构造函数完成后注入,构造函数的参数在构造函数期间自动注入

二.布局,控件:

  1. 继承Robo(Fragment)Activity,在类上面写@ContentView(布局id)

  2. 继承RoboFragment,布局还得在onCreateView里用inflater加载

  3. 在声明控件前写@InjectView(id)

    @InjectView(R.id.btn)
    Button button;
    

三.资源(anim,string,drawable,etc):

在资源前写@InjectResource(id),会自动调用getResource的方法获取并赋值

@InjectResource(R.anim.xxx) Animation animation;

String,drawable等资源类似。

四.系统服务:

在声明前写@Inject,会自动判断是否是系统服务,是的话调用getSystemService获取相应的系统服务

@Inject Vibrator v;

Notification,Wifi,GPS等类似。

五.普通java类:

  1. 在类声明前加@Inject会默认调用空构造方法创建对象

  2. 在某个构造方法上面加@Inject,则会调用该构造方法创建对象

  3. 构造方法里的参数也会按照注解规则创建新对象当作参数

  4. field也可以通过@Inject来注解java对象,会在当前类对象创建完后(构造器调用后)才会去创建 (扫描)注解的field

  5. 由3,4可知,构造器注解时参数被同样注解化(需要参数类型是可被注解的)创建使用;field注解时,在构造器里field还没被创建,不可使用

  6. 外层类如果没用到注解,则内部的field也不会用到注解了,因为没有开启注解的语句

六.单例模式:

  1. 在类上面加@Singleton,则@Inject的该java类在整个app中只有一个实例,且不会被回收直到应用结束

  2. 在类上面加@ContextSingleton,则@Inject的该java类在创建他的context中只有一个实例,且不会被回收直到该context结束生命周期

  3. 直接new的对象不会调用注入

七.Service和broadcastReceiver:

  1. 继承RoboService,在onCreate里会执行注入,之后可使用注入对象

  2. 继承BroadcastReceiver,重写handleReceive方法进行业务(onReceive方法里执行注入且调用handleReceive方法,所以不用重写onReceive类(已置为final))

八.Logging(和Log差不多):

Ln.v()/d()/w()等。

九.自定义view:

  1. 继承view类,在各个构造函数里加载完布局后调用注入方法

    RoboGuice.getInjector(getContext()).injectMembers(this)
    
  2. 重写View.onFinishInflate()方法,该方法执行时,注入对象可以使用

十.Event Listener:

  1. 写一个返回值为void,参数为一个@Observes注解的类的方法,比如系统提供的OnResumeEvent等周期方法,则在相应生命周期方法内会执行注入,调用该方法,和接口作用类似。
    exa:当RoboActivity执行注入时(onCreate里),在onResume方法里会用EventManager对象fire一个OnResumeEvent实例对象,并会调用以该类作为参数的方法并传入对象

    public class MyActivity extends RoboActivity{
    
     public void doSomethingOnResume(@Observes OnResumeEvent onResume){}
    
    }
    
  2. 这些方法可以直接写在类(context)中,也可以单写一个类,但是此时需要在context里@Inject该类的实例才会执行注解。

    exa:@Inject该类的实例才会执行注解

    public class MyActivity extends RoboActivity{
    
     @Inject MyEventListener listener;
    
    }
    
    class MyEventListener{
    
     public void doSomethingOnResume(@Observes OnResumeEvent onResume){}
    
    }
    
  3. 自定义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{}
    
  4. 系统提供了很多event类,大部分声明周期的相应方法都有:

    • OnActivityResultEvent

    • OnConfigurationChangedEvent

    • OnContentChangedEvent

    • OnContentViewAvailableEvent

    • OnCreateEvent

    • OnDestroyEvent

    • OnNewIntentEvent

    • OnPauseEvent

    • OnRestartEvent

    • OnResumeEvent

    • OnStartEvent

    • OnStopEvent

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值