Android 路由框架ARouter使用

这款路由框架是阿里Android技术团队开源的一款路由框架。

ARouter官方项目地址

添加依赖

//defaultconfig中加入
javaCompileOptions {

annotationProcessorOptions {

arguments = [moduleName :project.getName() ]

} }


compile'com.alibaba:arouter-api:1.3.1'

annotationProcessor'com.alibaba:arouter-compiler:1.1.4'

初始化

官方建议我们在Application里面进行ARouter初始化

  //在application
    public static boolean isDebug = true;

    @Override
    public void onCreate() {
        super.onCreate();
        //aRouter初始化
        if(isDebug){
            ARouter.openLog();
            ARouter.openDebug();
        }
        ARouter.init(this);
   }
    
// 关闭
      @Override
    public void onTerminate() {
        super.onTerminate();
        ARouter.getInstance().destroy();
    }

 

开始使用:

1)首先:在Activity/Fragment类上面写上 Route path 注解。

      注意:这里的路径需要注意的是至少需要有两级,/xx/xx

2)然后:在Activity/Fragment类里面进入Arouter 注入,写在基类中,也就是:ARouter.getInstance().inject(this);

3)接着:目标的Activity类上面需要声明Route path 注解,以此对应(跳转如果不对应路径,框架会Toast说路径不匹配)

标注地址

/**
 * ARouter 地址
 */
public class ARouterConstance {
  public static final String ACTIVITY_URL_MAIN = "/app/MainActivity";
  public static final String ACTIVITY_URL_NETWORK = "/app/networkactivity/NetworkActivity";


  public static final String GROUP_MAIN = "group_main";
  public static final  String GROUP_NETWORK = "group_network";

}

添加注解 

@Route( path =ARouterConstance.ACTIVITY_URL_MAIN,group = ARouterConstance.GROUP_MAIN)
public class MainActivity extends BaseActivity{。。。。。



@Route(path = ARouterConstance.ACTIVITY_URL_NETWORK,group = ARouterConstance.GROUP_NETWORK)
public class NetworkActivity extends BaseActivity {。。。。。

简单页面跳转

ARouter.getInstance().build(ARouterConstance.ACTIVITY_URL_NETWORK).navigation()

带参数的界面跳转

ARouter.getInstance().build(ARouterConstance.ACTIVITY_URL_NETWORK)
                .withSerializable("student",new Student(true))
                .withString("name","lsfsf")
                .withInt("age",320)
                .withParcelable("test",new Start("wi",30))//对象必须parcelable
                .navigation()

获取

    @Autowired()
    String name;
    @Autowired()
    int age;
    //@Autowired(name="test")
    Star star;

     //必须这杨获取
     student = (Student) getIntent().getSerializableExtra("student");

界面跳转动画

直接调用withTransition,里面传入两个动画即可(R.anim.xxx)

跳转动画

使用URI进行跳转

ARouter框架也可以使用URI进行匹配跳转,代码也很少,只需匹配路径一致即可完成跳转:

Fragment跳转

Fragment的跳转也可以参照Activity跳转,第一步依旧是先写上类注释,然后是强转,代码如下

拦截器:

    拦截器是ARouter这一款框架的亮点。说起拦截器这个概念,可能印象更加深刻的是OkHttp的拦截器,OkHttp的拦截器主要是用来拦截请求体(比如添加请求Cookie)和拦截响应体(判断Token是否过期)。

    ARouter的拦截器,是通过实现 IInterceptor接口,重写init()和process()方法去完成拦截器内部操作的。

 

/**
 * ARouter 拦截器
 */
@Interceptor(priority = 1)
public class UseIInterceptor implements IInterceptor {
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
        Log.e(ARouterConstance.TAG, " priority = 1----useIInterceptor_当前线程---- 
    }

    @Override
    public void init(Context context) {
        Log.e(ARouterConstance.TAG, " priority = 1----useIInterceptor " );
    }
}



/**
 * ARouter 拦截器
 */
@Interceptor(priority = 7)
public class UseSecondIInterceptor  implements IInterceptor {
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
        Log.e(ARouterConstance.TAG, " priority = 7----UseSecondIInterceptor_当前线程---- "+Thread.currentThread().getName() );
 
    }

    @Override
    public void init(Context context) {
        Log.e(ARouterConstance.TAG, " priority = 7---UseSecondIInterceptor " );
    }
}

使用Interceptor类注解的priority数值越小,越先执行,优先级越高。不能有相同

拦截

在两个拦截器中的process中加入以下代码

if(postcard.getPath().equals(ARouterConstance.ACTIVITY_URL_NETWORK)){
    Log.e(ARouterConstance.TAG, UseSecondIInterceptor.class.getName()+" 进行了拦截  ");
}
callback.onContinue(postcard);

监听拦截器

 ARouter.getInstance().build(ARouterConstance.ACTIVITY_URL_NETWORK)
            .navigation(this,/*startActivityForResult==*/123, new NavCallback() {
                @Override
                public void onArrival(Postcard postcard) {
                    err("目标抵达是调用--onFound"+"--goroup=="+postcard.getGroup()+"--path=="+postcard.getPath());
                }

                @Override
                public void onFound(Postcard postcard) {
                    super.onFound(postcard);
                    err("目标被发现时调用---onFound"+"--goroup=="+postcard.getGroup()+"--path=="+postcard.getPath());
                }

               
            });
}

首先是两个拦截器的初始化,然后,调用了NavigationCallback这个回调函数里面的onFound(),然后执行了拦截器里面的process()方法;当拦截器的process()方法执行完毕以后,最终回调了NavigationCallback里面的onArrival()方法。

NavigationCallback这个简单理解就是ARouter在路由跳转的过程中,我们可以监听路由的一个具体过程。它一共有四个方法:

 

回调里面的 Postcard 是什么 ,一个包含路线图的容器。能有些API会获取到相应的信息,

err("目标被发现时调用---onFound"+"--goroup=="+postcard.getGroup()+"--path=="+postcard.getPath());

得到

目标抵达是调用--onFound--goroup==group_network--path==/app/networkactivity/NetworkActivity

    通过Postcard可以获取到路径的组以及全路径,那么,路径的组(Group)又是什么?是这样,一般来说,ARouter在编译期框架扫描了所有的注册页面/字段/拦截器等,那么很明显运行期不可能一股脑全部加载进来,这样就太不和谐了。所以就使用分组来管理,我们的类标签里面的注释,对于group默认是 “ ”(空字符串)

   在 Group简单使用 这张图上面,根据日志,打印了分组的信息,可以发现Group的值默认就是第一个 /  /(两个分隔符) 之间的内容。

用组来进行跳转

ARouter.getInstance().build(ARouterConstance.ACTIVITY_URL_NETWORK,ARouterConstance.GROUP_NETWORK)
        .navigation()

 

ARouter如何实startActivityForResult()

发送
ARouter.getInstance().build(ARouterConstance.ACTIVITY_URL_NETWORK,ARouterConstance.GROUP_NETWORK) .navigation(this,/*请求码*/123)



返回
setResult(/*响应吗*/124)


接收
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        err("返回跳转====="+requestCode+"---"+resultCode);
    }

 

参考地址:https://www.jianshu.com/p/6021f3f61fa6

 

 

你可能感兴趣的:(android-第三方框架)