1、先按照Arouter官方指导添加相关的依赖:
implementation 'com.alibaba:arouter-api:1.5.0'
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
implementation 'com.alibaba:fastjson:1.2.48'
2、自定义一个Application,在里面initArouter,并添加到AndroidMainfest
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 这两行必须写在init之前,否则这些配置在init过程中将无效
if (BuildConfig.DEBUG) {
// 打印日志
ARouter.openLog();
// 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
ARouter.openDebug();
}
ARouter.init(this);
}
}
3、生成一个JavaBean对象,内容很简单
public class Persion {
int age;
String name;
public Persion(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Persion{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
protected void doSomething(){
Log.i("persion", "doSomething: ");
}
}
5、按照官方的说明:
如果需要传递自定义对象,新建一个类(并非自定义对象类),然后实现SerializationService,并使用@Route注解标注(方便用户自行选择序列化方式)
添加一个JsonServiceImpl类并实现SerializationService接口(自动生成几乎不需要自己做什么)
public class JsonServiceImpl implements SerializationService {
@Override
public void init(Context context) {
}
@Override
public T json2Object(String text, Class clazz) {
return JSON.parseObject(text, clazz);
}
@Override
public String object2Json(Object instance) {
return JSON.toJSONString(instance);
}
@Override
public T parseObject(String input, Type clazz) {
return JSON.parseObject(input, clazz);
}
}
6、MainActivity中开始跳转并传递对象
Persion obj = new Persion(17, "jacky");
ARouter.getInstance().build(Constants.PATH_MODULE_SECOND_ACTIVITY)
.withObject("obj",obj)
.navigation();
7、SecondActivity中接收对象
@Route(path = Constants.PATH_MODULE_SECOND_ACTIVITY)
public class SecondActivity extends AppCompatActivity {
@Autowired
Persion obj;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
ARouter.getInstance().inject(this);
Log.i("persion", "onCreate: "+obj.name);
Log.i("persion", "onCreate: "+obj.age);
}
}
但是运行起来,接收的obj始终是null。
和官方的demo对比,发现JavaBean对象需要添加一个无参的构造方法
public Persion(){
};
再次运行,这回不报空了,但是传过来的对象变量都是默认值
后来发现,JavaBean对象在定义变量时一定要是public,其他修饰词都会导致无法正常接收值。
修改后,一切正常
public int age;
public String name;
总结:
1、自定义的JavaBean对象一定要包含一个无参的构造方法
2、自定义的JavaBean对象一定要用public修饰
以上两点在官方指导中都没有明确写明,初学者很容易掉进坑里面。