阿里ARouter初探

一、路由介绍

1.定义:

       ARouter是阿里巴巴自研路由框架,主要解决组件间、模块间的界面跳转问题.

2.为啥使用ARouter?

      从使用场景分析:

 2.1

      动态跳转:一般来说复杂的电商跳转多页面需要很强的灵活性,很多情况下是运营人员动态配置的下发活动页面,需要灵活的进行跳转.

2.2

       组件化:随着业务量的不断增长,app也会越来越大,开发团队的规模和工作量也会逐渐增大,面对所衍生的64K问题、协作开发问题等,app一般都会走向组件化。组件化就是将APP按照一定的功能和业务拆分成多个组件module,不同的组件独立开发,组件化不仅能够提供团队的工作效率,还能够提高应用性能。而组件化的前提就是解耦,那么我们首先要做的就是解耦页面之间的依赖关系.

2.3

        Native与H5的问题:现在的APP很少是纯Native的,也很少会有纯H5的,一般情况下都是将两者进行结合。这时候就需要非常便捷并且统一的跳转方案,因为在H5中是无法使用StartActivity()跳转到Native页面的,而从Native跳转到H5页面也只能通过配置浏览器的方式实现.

2.4

    其他场景分析: 原生跳转方式的不足

  2.4.1  

       显式跳转:Intent intent = new Intent(activity, XXActivity.class); 由于需要直接持有对应class,从而导致了强依赖关系,提高了耦合度.

  2.4.2  

         隐式跳转:譬如 Intent intent = new Intent(); intent.setAction(“com.android.activity.MY_ACTION”);
action等属性的定义在Manifest,导致了扩展性较差
规则集中式管理,导致协作变得非常困难.

  2.4.3

        原生的路由方案会出现跳转过程无法控制的问题,因为一旦使用了StartActivity()就无法插手其中任何环节了,只能交给系统管理,这就导致了在跳转失败的情况下无法降级,而是会直接抛出运行时的异常.

二:ARouter的使用如下:

在各个模块的build.gradle中添加编译参数和依赖的框架

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

dependencies {
    // 替换成最新版本, 需要注意的是api
    // 3.0以上的需要把compile换成implementation匹配使用,均使用最新版可以保证兼容    
    implementation fileTree(dir: 'libs', include: ['*.jar']
    implementation 'com.alibaba:arouter-api:1.4.1'
    annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
    ...
}

我的项目build配置截图如下

2.初始化sdk:

   Application代码如下:

/**
 * 作者: njb
 * 时间: 2018/5/30 0030-上午 11:29
 * 描述: Application
 * 来源:
 */
public class App extends BaseApplication {

    private boolean debug = true;

    @Override
    public void onCreate() {
        super.onCreate();
        initARouter();
    }

    @Override
    protected String getBaseUrl() {
        return null;
    }

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

    public boolean isDebug() {
        return debug;
    }
}
3.添加注解:

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

    private TextView text;

    @Autowired
    public String key3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        ARouter.getInstance().inject(this);
        Toast.makeText(this, "收到传送过来的数据:" + key3, Toast.LENGTH_LONG).show();
        text = findViewById(R.id.text);
        text.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
    }
}
4.路由操作:

4.1在Activity中的跳转如下: 

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.chat_tv:
            ARouter.getInstance().build("/chat/main")
                    .withLong("key1", 77878L)
                    .withString("key3", "334455")
                    .navigation();
            break;
        case R.id.contract_tv:
            ARouter.getInstance().build("/home/main")
                    .withString("userone","张龙")
                    .withString("usertwo","赵虎")
                    .withString("userthree","马超")
                    .navigation();
            break;
        case R.id.find_tv:
            ARouter.getInstance().build("/find/main")
                    .withString("name","张三")
                    .withString("title","今日进入热搜头条")
                    .withString("content","内容太过真实,吴京带小板凳坐火车,看样子买的是站票")
                    .navigation();
            break;
        case R.id.mine_tv:
            ARouter.getInstance().build("/mine/main")
                    .withString("nickname","你是我的眼")
                    .withString("height","188")
                    .withString("age","26")
                    .withString("fans","33")
                    .withString("follow","5")
                    .withString("zan","10")
                    .navigation();
            break;
        case R.id.say_hello_tv:
            Toast.makeText(this, baseService.sayHello("开始聊天"), Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
    }
}

4.2 在Fragment中的跳转如下:

5.通过依赖注入解耦:服务管理(一) 暴露服务

 

/**
 * 作者: njb
 * 时间: 2018/5/30 0030-上午 11:29
 * 描述:  接口为各个组件间通讯的代理接口,继承了 @IProvider
 *           各个组件要暴露方法时可以继承在commonlib 里创建的接口并实现方法
 * 来源:
 */

public interface HomeExportService extends IProvider {
    String sayHello(String s);
}

6.通过依赖注入解耦:服务管理(二) 发现服务

 @Autowired(name = "/home/HomeService")

public HomeExportService baseService;

总结:官方的文档Github很详细小伙伴们可以去看看,以上ARouter的简单使用,写得不好还望大家多多见谅.

最后附上demo地址:https://gitee.com/jackning_admin/AliRouterDemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值