得到Android组件化方案已经开源,参见Android组件化方案开源。方案的解读文章是一个小的系列,这是系列的第四篇文章:
1、Android彻底组件化方案实践
2、Android彻底组件化demo发布
3、Android彻底组件化-代码和资源隔离
4、Android彻底组件化—UI跳转升级改造
5、Android彻底组件化—如何使用Arouter

JIMU开源以后,收到了很多朋友的评论或者私信,提出了很多有价值的意见和建议,一个比较集中的点就在于组件之间的UI跳转不够优雅。当时由于业务比较紧张,没有时间来完善这块,最近终于抽出时间把UI跳转的功能进行了升级改造,期间也得到@leobert等大牛的鼎力支持以及ARouter等优秀方案的启发,现在JIMU新的UI跳转功能已经发布了,欢迎大家使用。

已实现功能

(1)按组件区分host,增加URL的可读性
(2)自动注册路由,不再需要手动编写代码进行路由分发
(3)按需加载,只有实际跳转到某个组件是,该组件的路由表才会加载
(4)自动生成路由表文件,方便组件开发团队之间调用
(5)参数支持依赖注入,不需要编写参数的解析代码

URL结构

组件之间的UI跳转是基于标准的URL来实现的,先简单看一下URL的基本构成:

:///?

这个是最简单的一个模型,不过用于我们UI跳转协议已经足够了。下面是一个跳转到分享页面的实例:

DDComp://share/shareBook?bookName=Gone with the Wind

结合我们的组件化框架,我们简单讲一下各部分的含义

(1)scheme对应的是DDComp,这个在JIMU没有限制,使用时可以自己自由设置,一般为了从应用外跳转进来,会在manifest的入口Activity添加以下配置

                    

(2)host对应的是share。在组件化框架中,每个组件对应一个唯一的host,例如分享组件的host就是share,读书组件的host是reader等等。
● host是路由分发的第一级,根据host可以定位到每个组件。
● host还可以对所有的路由URL进行一个分组,只有调用到该分组的路由的时候,组内的路由才会被加载进内存

(3)path对应的是shareBook。它对应的是具体的每个具体的页面,例如shareBook对应就是ShareActivity。在一个组件之内,path是不能重复的

(4)query对应的是bookName=Gone with the Wind。它表示要跳转到ShareActivity,需要传入的参数,例如这里需要传入书的名字等。

下面我们就讲一下如何使用JIMU的UI跳转新功能!

组件添加必要的依赖

在组件的build.gradle中添加依赖

annotationProcessor 'com.luojilab.ddcomponent:router-anno-compiler:1.0.0'

同时添加

defaultConfig {    javaCompileOptions {        annotationProcessorOptions {             arguments = [host: "share"]        }    }}

此处的"share"是跳转URI中的host,每个组件需要设置不同的host。

注册组件到UIRouter中

在组件的声明周期类ApplicationLike中,添加注册和反注册代码

public class ShareApplike implements IApplicationLike {    UIRouter uiRouter = UIRouter.getInstance();    @Override    public void onCreate() {        uiRouter.registerUI("share");    }    @Override    public void onStop() {        uiRouter.unregisterUI("share");    }}

目标页面添加注解

首先在跳转的目的Activity上添加RouteNode注解

@RouteNode(path = "/shareBook", desc = "分享书籍页面")public class ShareActivity extends AppCompatActivity {

如果需要传入参数,在具体的参数定义上增加Autowired注解:

@AutowiredString bookName;@AutowiredAuthor author;

注意此处的参数不能是private的,否则编译会直接报错。这里的原因在于依赖注入的时候没有使用反射,而是直接调用了该参数,所以需要参数至少是包可见的。

依赖注入

如果想使用自动装载功能,需要在Activity的onCreate中调用方法

AutowiredService.Factory.getInstance().create().autowire(this);

建议该方法在基类Activity中调用

build项目

项目执行build,会生成apt文件,具体可在build目录下面查看
同时还会在根目录生成UIRouterTable文件夹,里面会列出每个组件向外提供的路由表

auto generated, do not change !!!! HOST : share分享杂志页面/shareMagazineauthor:com.luojilab.componentservice.share.bean.AuthorbookName:String分享书籍页面/shareBookauthor:com.luojilab.componentservice.share.bean.AuthorbookName:String

跳转

在发起跳转页面,有三种方式可以跳转到目的页面

Bundle方式
    // UI transfer with Bundle    private void goToShareActivityWithBundle() {        Author author = new Author();        author.setName("Margaret Mitchell");        author.setCounty("USA");        Bundle bundle = new Bundle();        bundle.putString("bookName", "Gone with the Wind");        bundle.putString("author", JsonService.Factory.getInstance()                .create().toJsonString(author));        UIRouter.getInstance().openUri(getActivity(), "DDComp://share/shareBook", bundle);    }
URI方式
    // UI transfer with URI    private void goToShareActivityWithUri() {        Author author = new Author();        author.setName("Barack Obama");        author.setCounty("New York");        final String URI_LEGAL = "DDComp://share/shareMagazine?bookName=NYTIME&author=";        legal and illegal data delivering*/        UIRouter.getInstance().openUri(getActivity(),                URI_LEGAL                        + JsonService.Factory.getInstance().create().toJsonString(author), null);    }
startActivityForResult
    //startActivityForResult    private void goToShareActivityForResult() {        Author author = new Author();        author.setName("Margaret Mitchell");        author.setCounty("USA");        UIRouter.getInstance().openUri(getActivity(),                "DDComp://share/shareBook?bookName=Gone with the Wind&author="                        + JsonService.Factory.getInstance().create().toJsonString(author), null, 7777);    }

具体使用请参见github源码 https://github.com/mqzhangw/AndroidComponent。如果对方案有不理解的地方,欢迎阅读解析文章Android彻底组件化方案实践和Android彻底组件化demo发布

目前很多app已经使用ARouter来进行UI跳转,JIMU也是支持ARouter的,只是为了更契合现在的组件化框架,所以自己实现了一套。鉴于已使用ARouter的app迁移成本有点高,后面会专门写一篇如何在组件化框架中使用ARouter的文章,敬请期待!

JIMU的讨论群,群号693097923,欢迎大家加入:


Android彻底组件化—UI跳转升级改造_第1张图片 进群请扫码

更多相关文章

  1. Android 应用框架 —— 组件
  2. 第三部分:Android 应用程序接口指南---第一节:应用程序组件---第五
  3. 7款Android开发者常用的Android UI组件
  4. Android 基于注解IOC组件化/模块化的架构实践
  5. Android系统架构分析 和 Android应用程序组件介绍
  6. android线性布局参数详解
  7. Android彻底组件化方案实践

随机推荐

  1. android 日期按钮实现
  2. android中填充界面布局的三种方式
  3. Android 中关于 【Cursor】 类的介绍、数
  4. 命令方式启动安卓模拟器(M9)
  5. Android屏幕大小,翻转,控件居中相关技巧
  6. Android UI架构(五)--探秘刷新动力Vsync(
  7. Android(安卓)系统信息获取(CPU,RAM,ROM,
  8. Android 清除数据
  9. RadioGroup ,CheckBox ,Toast
  10. android动画效果演示