ARouter使用详解

步骤:

一、添加依赖

在module的gradle中添加

    defaultConfig {
        ...

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

        ...
    }
dependencies {
    ...

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

版本自行选择

二、初始化SDK

自定义Application中添加

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

三、使用

1、添加注解:在支持路由的页面上添加注解(必选) 这里的路径需要注意的是至少需要有两级,/xx/xx

 2、

  • 应用内简单的跳转

  • 跳转并携带参数

  • 使用URI进行跳转及拦截器的使用

  • startActivityForResult功能实现

// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = Contants.MAIN_ACTIVITY)
public class MainActivity extends BaseActivity {

    public static final String TAG = "zzMainActivity";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    /**
     * 跳转的用法
     *
     * @param view
     */
    public void btn(View view) {
        // 1. 应用内简单的跳转
//        ARouter.getInstance().build(Contants.SECOND_ACTIVITY).navigation();
        // 2. 跳转并携带参数
//        ARouter.getInstance().build(Contants.SECOND_ACTIVITY)
//                .withInt("age", 28).withString("name", "cyz").navigation();

//        todo1();
        todo2();
    }


    /**
     * startActivityForResult功能实现
     */
    private void todo2() {
        ARouter.getInstance().build(Contants.SECOND_ACTIVITY)
              .withInt("age", 28).withString("name", "cyz").navigation(this,111);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case 111:
                Log.d(TAG, "onActivityResult----" + data.getStringExtra("Result"));
                break;
            default:
                break;
        }
    }

    /**
     * //使用URI进行跳转及拦截器的使用
     */
    private void todo1() {

        Uri uri = Uri.parse(Contants.SECOND_ACTIVITY);
        ARouter.getInstance().build(uri).withString("name", "android").withInt("age", 6)
                .navigation(this, new NavigationCallback() {//NavigationCallback这个简单理解就是ARouter在路由跳转的过程中,我们可以监听路由的一个具体过程
                    @Override
                    public void onFound(Postcard postcard) {//路由目标被发现时调用
                        Log.d(TAG, "onFound----getPath=" + postcard.getPath() + "---getGroup=" + postcard.getGroup());
                    }

                    @Override
                    public void onLost(Postcard postcard) {//路由被丢失时调用
                        Log.d(TAG, "onLost----" + postcard.getPath());
                    }

                    @Override
                    public void onArrival(Postcard postcard) {//路由到达时被调用
                        Log.d(TAG, "onArrival----" + postcard.getPath());
                    }

                    @Override
                    public void onInterrupt(Postcard postcard) {//路由被拦截时调用
                        Log.d(TAG, "onInterrupt----" + postcard.getPath());
                    }
                });
    }
}

/** @Autowired
    String name;
 !!!!不能写成!!!!
 @Autowired
 private tring name;
 *
 */
@Route(path = Contants.SECOND_ACTIVITY)
public class SecondActivity extends BaseActivity {

    @Autowired
    String name;

    @Autowired
    int age;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        ((TextView) findViewById(R.id.tv)).setText(name + age);

        Intent intent=new Intent();
        intent.putExtra("Result","Result");
        setResult(111,intent);
    }
}

拦截器的使用

    声明拦截器(拦截跳转过程,面向切面编程)

比较经典的应用就是在跳转过程中处理登陆事件,这样就不需要在目标页重复做登陆检查

拦截器会在跳转之间执行,多个拦截器会按优先级顺序依次执行


@Interceptor(priority = 1)
public class FirstIntercepter implements IInterceptor {
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
        Log.d(Contants.TAG,
                "FirstIntercepter----process---线程名称:" + Thread.currentThread().getName());
        if (postcard.getPath().equals(Contants.SECOND_ACTIVITY)){
            //拦截操作
            Log.d(Contants.TAG,
                    "FirstIntercepter----postcard.getPath():" + postcard.getPath());
        }
        callback.onContinue(postcard);
// callback.onInterrupt(new RuntimeException("我觉得有点异常"));      // 觉得有问题,中断路由流程

	// 以上两种至少需要调用其中一种,否则不会继续路由
    }

    @Override
    public void init(Context context) {
        Log.d(Contants.TAG, "FirstIntercepter----init");
    }
}

@Interceptor(priority = 7)
public class SecondIntercepter implements IInterceptor {
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
        Log.d(Contants.TAG,
                "SecondIntercepter----process---线程名称:" + Thread.currentThread().getName());
        if (postcard.getPath().equals(Contants.SECOND_ACTIVITY)){
            //拦截操作
            Log.d(Contants.TAG,
                    "SecondIntercepter----postcard.getPath():" + postcard.getPath());
        }
        callback.onContinue(postcard);/// 处理完成,交还控制权
    }

    @Override
    public void init(Context context) {//// 拦截器的初始化,会在sdk初始化的时候调用该方法,仅会调用一次
        Log.d(Contants.TAG, "SecondIntercepter----init");
    }
}

代码:https://download.csdn.net/download/u013359807/10603300

猜你喜欢

转载自blog.csdn.net/u013359807/article/details/81668405
今日推荐