ARouter的简单使用

1,024 阅读2分钟

依赖

implementation 'com.alibaba:arouter-api:1.3.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'

android-defaultConfig节点下添加,用到Arouter的都要添加,组件也要添加

javaCompileOptions {
     annotationProcessorOptions {
         arguments = [AROUTER_MODULE_NAME: project.getName()]
     }
}

初始化

  1. 在Application中初始化SDK

    private void initARouter() { if (isDebug()) { // 这两行必须写在init之前,否则这些配置在init过程中将无效 ARouter.openLog(); // 打印日志 ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险) } ARouter.init(this); // 尽可能早,推荐在Application中初始化 }

    public boolean isDebug() { return debug; }

  2. 混淆设置

    -keep public class com.alibaba.android.arouter.routes.{*;} -keep public class com.alibaba.android.arouter.facade.{;} -keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{;} -keep interface * implements com.alibaba.android.arouter.facade.template.IProvider

基本使用

  1. 不带参跳转
  • 跳转页面,使用build设置要跳转的path

    ARouter.getInstance().build("/signing/main").navigation();

  • 目标页面,使用@Route注解设置path

    @Route(path = "/signing/main") public class SigningActivity extends AppCompatActivity { .... }

  1. 带参跳转
  • 跳转页面,使用withXXX来设置要传递的参数,此处用法和intent类似

    ARouter.getInstance().build(ArouterConstan.SIGNING_MAIN) .withString("path", path) .navigation();

  • 目标页面

第一种与第二种需要配合 ARouter.getInstance().inject(this);使用,在oncreate中调用

//第一种,指定name,变量名就可以随便定义了
@Autowired(name = "path")
private String path_alias;

//第二种,不指定名称,变量名要与key相同
@Autowired()
private String path;

//第三种
private String in_path = getIntent.getExtras().getString("path");

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_signing);
    ARouter.getInstance().inject(this);
  ......

}
  1. 带对象跳转
  • 定义解析类

    @Route(path = "/signing/json") public class JsonSerializationService implements SerializationService { Gson gson; @Override public T json2Object(String input, Class clazz) { return gson.fromJson(input,clazz); } @Override public String object2Json(Object instance) { return gson.toJson(instance); } @Override public T parseObject(String input, Type clazz) { return gson.fromJson(input,clazz); } @Override public void init(Context context) { gson = new Gson(); } }

  • 跳转页面

    FileInfo fileInfo = new FileInfo(); ARouter.getInstance().build(ArouterConstan.SIGNING_MAIN) .withString("path", path) .withObject("obj",fileInfo) .navigation();

  • 目标页面

    SerializationService serializationService = ARouter.getInstance().navigation(JsonSerializationService.class); serializationService.init(this); FileData obj = serializationService.parseObject(getIntent().getStringExtra("obj"), User.class);

  1. 通过uri跳转
  • AndroidManifest文件的Activity节点下配置

  • 跳转页面

    Uri uri = Uri.parse("test://ideal.com/signing/main"); ARouter.getInstance().build(uri).navigation();

  • 目标页面

    @Route(path = "/signing/main") public class SigningActivity extends AppCompatActivity{ .... }

  1. 跳转回调

    ARouter.getInstance().build(uri).navigation(this, new NavCallback() { @Override public void onInterrupt(Postcard postcard) { super.onInterrupt(postcard); //被拦截了 }

    @Override
    public void onArrival(Postcard postcard) {
        //正常交还控制权
    }
    

    });

  2. 跳转拦截

    @Interceptor(priority = 8, name = "test interceptor") public class TestInterceptor implements IInterceptor { @Override public void process(Postcard postcard, InterceptorCallback callback) {

      //两者一定要调用一个
        callback.onContinue(postcard);  
        // callback.onInterrupt(new RuntimeException("Something exception"));      
    }
    
    @Override
    public void init(Context context) {
    
    }
    

    }

  3. startActivityForResult模式

    ARouter.getInstance().build("/home/main").navigation(this, 5); //第一个参数必须是Activity,第二个参数是requestCode

  4. 页面跳转动画

    ARouter.getInstance() .build("/signing/main") .withTransition(R.anim.activity_in, R.anim.activity_out) .navigation(this);

  5. 跳过所有的拦截器

    ARouter.getInstance().build("/signing/main").greenChannel().navigation();