当你从FirstActivity跳到SecondActivity, 有时需要把参数值放在intent里面传过去。
ARouter的依赖注入会帮你在SecondActivity里面的属性直接赋好参数值。 当然需要你事先在SecondActivity已经定义好属性,并且是public的。
先看下面的代码:
添加了两个接受参数的属性。
public class SecondActivity extends AppCompatActivity {
@Autowired
public int testInt;
@Autowired
public String testString;
public void onCreated(){
ARouter.inject(this);
}
}
FirstActivity 通过ARouter打开SecondActivity,SecondActivity在执行 ARouter.inject(this)后,int testInt; String testString 这两个属性会被赋好值。
public class FirstActivity extends AppCompatActivity {
public void onClick(View view){
ARouter.getInstance()
.build("/app/SecondActivity")
.withInt("testInt", testInt)
.withString("testString", testString)
.Navigation();
}
}
以上是ARouter依赖注入的功能表现。当然不仅仅限于Activity,也可以是Fragment。
那么是如何实现的呢?
下面这个类是ARouter根据注解自动生成的类。
public class SecondActivity$$ARouter$$Autowired implements ISyringe {
private SerializationService serializationService;
@Override
public void inject(Object target) {
serializationService = ARouter.getInstance().navigation(SerializationService.class);
SecondActivitysubstitute = (SecondActivity)target;
substitute.testInt = substitute.getIntent().getIntExtra("testInt", substitute.testInt);
substitute.testString = substitute.getIntent().getStringExtra("testString");
}
}
再来看一下ARouter.inject(this)最后调用的是什么。最后调用的就是上面SecondActivity$$ARouter$$Autowired类的inject方法。inject()里面的就是我们平时常用的方式。
static void inject(Object thiz) {
AutowiredService autowiredService = ((AutowiredService) ARouter.getInstance().build("/arouter/service/autowired").navigation());
if (null != autowiredService) {
autowiredService.autowire(thiz);
}
}
这个有一个坑要说一下,由于赋值是依赖intent的,而在onNewIntent回来的时候,并没有intent, 导致依赖注入失败。原因是没有先setIntent(intent); 然后再调用ARouter.inject(this)就不会有问题。
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
ARouter.inject(this);
}
像上面那样使用就可以了。