获得Android组件化方案已经开源,参见Android组件化方案开源。方案的解读文章是一个小的系列,这是系列的第四篇文章:java
自从8月份获得组件化方案AndroidComponent开源之后,收到了不少朋友的评论或者私信,提出了不少有价值的意见和建议,一个比较集中的点就在于组件之间的UI跳转不够优雅。当时因为业务比较紧张,没有时间来完善这块,最近终于抽出时间把UI跳转的功能进行了升级改造,期间也获得@leobert等大牛的鼎力支持以及ARouter等优秀方案的启发,如今DDComponent新的UI跳转功能已经发布了,欢迎你们使用。android
##已实现功能git
##URL结构 组件之间的UI跳转是基于标准的URL来实现的,先简单看一下URL的基本构成:github
<scheme>://<host>/<path>?<query>
复制代码
这个是最简单的一个模型,不过用于咱们UI跳转协议已经足够了。下面是一个跳转到分享页面的实例:bash
DDComp://share/shareBook?bookName=Gone with the Wind
复制代码
结合咱们的组件化框架,咱们简单讲一下各部分的含义app
(1)scheme对应的是DDComp,这个在DDComponent没有限制,使用时能够本身自由设置,通常为了从应用外跳转进来,会在manifest的入口Activity添加如下配置框架
<intent-filter>
<data android:scheme="DDComp" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
复制代码
(2)host对应的是share。在组件化框架中,每一个组件对应一个惟一的host,例如分享组件的host就是share,读书组件的host是reader等等。ide
(3)path对应的是shareBook。它对应的是具体的每一个具体的页面,例如shareBook对应就是ShareActivity。在一个组件以内,path是不能重复的组件化
(4)query对应的是bookName=Gone with the Wind。它表示要跳转到ShareActivity,须要传入的参数,例如这里须要传入书的名字等。gradle
下面咱们就讲一下如何使用DDComponent的UI跳转新功能!
在组件的build.gradle中添加依赖
annotationProcessor 'com.luojilab.ddcomponent:router-anno-compiler:1.0.0'
复制代码
同时添加
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [host: "share"]
}
}
}
复制代码
此处的"share"是跳转URI中的host,每一个组件须要设置不一样的host。
在组件的声明周期类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注解:
@Autowired
String bookName;
@Autowired
Author author;
复制代码
注意此处的参数不能是private的,不然编译会直接报错。这里的缘由在于依赖注入的时候没有使用反射,而是直接调用了该参数,因此须要参数至少是包可见的。
若是想使用自动装载功能,须要在Activity的onCreate中调用方法
AutowiredService.Factory.getInstance().create().autowire(this);
复制代码
建议该方法在基类Activity中调用
项目执行build,会生成apt文件,具体可在build目录下面查看 同时还会在根目录生成UIRouterTable文件夹,里面会列出每一个组件向外提供的路由表
auto generated, do not change !!!!
HOST : share
分享杂志页面
/shareMagazine
author:com.luojilab.componentservice.share.bean.Author
bookName:String
分享书籍页面
/shareBook
author:com.luojilab.componentservice.share.bean.Author
bookName:String
复制代码
在发起跳转页面,有三种方式能够跳转到目的页面
// 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);
}
复制代码
// 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
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源码。
若是对方案有不理解的地方,欢迎阅读解析文章Android完全组件化方案实践和Android完全组件化demo发布
目前不少app已经使用ARouter来进行UI跳转,DDComponent也是支持ARouter的,只是为了更契合如今的组件化框架,因此本身实现了一套。鉴于已使用ARouter的app迁移成本有点高,后面会专门写一篇如何在组件化框架中使用ARouter的文章,敬请期待!