Android ARouter使用

文章目录

      • 简介
      • ARouter配置
      • ARouter简单使用
          • 初始化
          • 基本使用
          • 拦截器
          • 服务
      • 代码混淆

简介

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

使用ARouter的优势:

  • 支持直接解析标准URL进行跳转,并自动注入参数到目标界面
  • 支持多模块工程使用
  • 支持添加多个拦截器,自定义拦截顺序
  • 映射关系按组分类、多级管理,按需初始化
  • 支持用户指定全局降级与局部降级策略
  • 支持多种方式配置转场动画
  • 支持获取Fragment

原生路由方案一般是通过显示intent和隐式intent两种方式实现的,在显示intent中,存在直接类依赖的问题,导致耦合度高,在隐式intent中,则会出现规则集中式管理,导致协作不方便,这时候使用ARouter就方便处理这些问题了。

ARouter配置

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

...
    
dependencies {
    ...
    implementation 'com.alibaba:arouter-api:1.4.1'
    annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
}

可选:

apply plugin: 'com.alibaba.arouter'

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath "com.alibaba:arouter-register:?"
    }
}

ARouter简单使用

初始化
public class BaseApp extends Application {
    private boolean isDebugARouter = true;

    @Override
    public void onCreate() {
        super.onCreate();
        if (isDebugARouter) {
            //必须在init之前
            ARouter.openLog();//打印日志
            ARouter.openDebug();//线上版本需要关闭
        }
        //官方推荐在Application中初始化
        ARouter.init(this);
    }
}
基本使用
/*
普通使用
*/
findViewById(R.id.skip).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //build里是URL路径
        ARouter.getInstance().build(Constant.ACITIVTY_SAMPLE)
            //传String类型
            .withString("name", "hello 我是ARouter")
            //传int类型
            .withInt("age", 18)
            //传序列化对象
            .withSerializable("data", new Data("Tom", 19))
            //转场动画,navigation必须设置第一个参数
            .withTransition(R.anim.slide_in_bottom, R.anim.slide_out_bottom)
            //第二个参数是requestCode
            .navigation(MainActivity.this, 123);
    }
});

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 123 && resultCode == 456) {
        Log.e(Constant.TAG, "onActivityResult");
    }
}
@Route(path = Constant.ACITIVTY_SAMPLE)
public class SampleActivity extends BaseActivity {
    @Autowired
    String name = "无名";
    @Autowired
    int age = 10;
    @Autowired
    Data data;

    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sample);

        textView = findViewById(R.id.textView);
        textView.setText("姓名:" + name + ",年龄:" + age + ",data:" + data);

        setResult(456);
    }
}
拦截器

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

 /*
 使用拦截器
 */
findViewById(R.id.interceptor).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ARouter.getInstance().build(Constant.ACITIVTY_SAMPLE2)
            .navigation(MainActivity.this, new NavigationCallback() {
                @Override
                public void onFound(Postcard postcard) {
                    Log.e(Constant.TAG, "路由目标发现");
                }

                @Override
                public void onLost(Postcard postcard) {
                    Log.e(Constant.TAG, "路由目标丢失");
                }

                @Override
                public void onArrival(Postcard postcard) {
                    Log.e(Constant.TAG, "路由目标跳转");
                }

                @Override
                public void onInterrupt(Postcard postcard) {
                    Log.e(Constant.TAG, "路由目标被拦截");
                }
            });
    }
});

定义一个拦截器

//priority:优先级,数值越大级别越高
@Interceptor(priority = 1)
public class UserInterceptor implements IInterceptor {
    @Override
    public void init(Context context) {
        Log.e(Constant.TAG, "init 拦截器");
    }

    @Override
    public void process(final Postcard postcard, final InterceptorCallback callback) {
        Log.e(Constant.TAG, "process 拦截器:" + postcard.getPath());
        if (Constant.ACITIVTY_SAMPLE2.equals(postcard.getPath())) {
            //拦截操作
            MainLooper.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    new AlertDialog.Builder(MainActivity.getThis())
                            .setCancelable(false)
                            .setTitle("提示")
                            .setNegativeButton("继续", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    //继续路由
                                    callback.onContinue(postcard);
                                }
                            })
                            .setPositiveButton("加点数据", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    //新增数据
                                    postcard.withString("name", "hello 这里是ARouter!!!");
                                    callback.onContinue(postcard);
                                }
                            })
                            .setNeutralButton("取消", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    //中断路由
                                    callback.onInterrupt(null);
                                }
                            })
                            .show();
                }
            });
        } else {
            callback.onContinue(postcard);
        }
    }
}
服务

这里的服务是接口开发的概念,就是将一部分功能和组件封装起来成为接口,以接口的形式对外提供能力,所以在这部分就可以将每个功能作为一个服务,而服务的实现就是具体的业务功能。

/*
服务
*/
findViewById(R.id.service).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //方法一
        ARouter.getInstance().navigation(HelloService.class).say("hello 方式一");

        //方法二
        ((HelloService) ARouter.getInstance().build(Constant.SERVICE_HELLO).navigation())
        .say("hello 方式二");

        //方式三
        ARouter.getInstance().navigation(SingleService.class).say("hello 方式三");
    }
});

定义一个服务接口:

public interface HelloService extends IProvider {
    void say(String content);
}

实现服务接口

@Route(path = Constant.SERVICE_HELLO)
public class HelloServiceImpl implements HelloService {
    @Override
    public void init(Context context) {
    }

    @Override
    public void say(String content) {
        Log.e(Constant.TAG, "say:" + content);
    }
}

直接实现服务接口

@Route(path = Constant.SERVICE_SINGLE)
public class SingleService implements IProvider {
    @Override
    public void init(Context context) {
    }

    public void say(final String content) {
        Log.e(Constant.TAG, "say:" + content);
    }
}

代码混淆

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

# 如果使用了 byType 的方式获取 Service,需添加下面规则,保护接口
-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider

# 如果使用了 单类注入,即不定义接口实现 IProvider,需添加下面规则,保护实现
# -keep class * implements com.alibaba.android.arouter.facade.template.IProvider

代码下载

你可能感兴趣的:(Android,Android,ARouter)