热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何解决Router跨模块跳转问题

web前端|js教程Router跨模块下页面跳转,Router,跨模块web前端-js教程开始模块化开发项目之后,一个很重要的问题就是页面见的跳转问题,这篇文章主要介绍了Route

web前端|js教程如何解决Router跨模块跳转问题
Router跨模块下页面跳转,Router,跨模块
web前端-js教程
开始模块化开发项目之后,一个很重要的问题就是页面见的跳转问题,这篇文章主要介绍了Router解决跨模块下的页面跳转示例,现在分享给大家,也给大家做个参考。
短信平台软件源码,vscode 如何设置快捷,ubuntu卸载 ssr,tomcat服务版 内存,薄荷爬虫,php正则表达式匹配邮箱,seo推广营销平台分类,门户网站 jsp 下载,业务平台模板源码下载lzw
A、前言
在线投票项目源码,安装ubuntu分区卡机,tomcat中间件创建数据源,python爬虫修改页面,php数据库缓存技术交流,seo快速赚钱lzw
开始模块化开发项目之后,一个很重要的问题就是页面见的跳转问题。
博客主页html源码,ubuntu字符有乱码,shell爬虫网页信,引入,北京seo资源lzw
关于模块化发开,可详见我的另一片文章 Android模块化开发探索 。

正是由于将项目模块化拆分,各模块之间没有任何依赖关系,也互相不可见,那么从A模块的a界面跳转到B模块的b界面该怎么办呢?

B、跨模块跳转的方法

这里我们会先介绍这几种常见的跳转方法:

显示跳转

隐示跳转

Scheme协议跳转

Router路由表方案

2.1 显示跳转

显示跳转即我们最最常用的跳转方法:使用Intent,传入当前Activity上下文,和目标Activity的class对象即可,如下:

Intent intent = new Intent();intent.setClass(mContext, GuideActivity.class);startActivity(intent);

显然,这种方法只能是目标Activity可见(Activity在同一个Module下)的时候才可以这样调用。不适合跨模块间的跳转。

2.2 隐示跳转

我们这里说的隐示跳转,intent不设置class,而是设置Action或者Category。

例如:

在清单文件中

跳转时:

//创建一个隐式的 Intent 对象:Action 动作 Intent intent = new Intent(); //设置 Intent 的动作为清单中指定的action intent.setAction("com.whaty.base.BaseWebViewActivity"); startActivity(intent);

2.3 scheme跳转

如果我们为 B 页面定义一个 URI – wsc://home/bbb,然后把共享的 messageModel 拍平序列化成 Json 串,那么 A 只需要拼装一个符合 B 页面 scheme 的跳转协议就可以了。 wsc://home/bbb?message={ “name”:”John”, “age”:31, “city”:”New York” }

在清单文件中,配置data属性,设置其host、path、scheme等

跳转时:

final Uri uri = new Uri.Builder().authority("wsc").path("home/bbb").appendQueryParameter("message", new Gson().toJson(messageModel)).build();final Intent intent = new Intent(Intent.ACTION_VIEW);intent.setData(uri);startActivity(intent);

以上的方法,都不是我们想要的,接下来开始介绍我们的Router方案。

C、为什么要用Router

Google提供了显式和隐式两种原生路由方案。但在模块化开发中,显式Intent存在类直接依赖的问题,造成模块间严重耦合。隐式Intent则需要在Manifest中配置大量路径,导致难以拓展(如进行跳转拦截)。为了解决以上问题,我们需要采用一套更为灵活的Router方案。

D、实现思路

思路是这样的:

使用注解,为每个目标Activity标注别名。在应用启动时,对所有类进行扫名,将注解过的Activity存于路由表中。

跳转时,在路由表中通过别名获取目标Activity的class对象,使用Intent实现跳转。

如何解决Router跨模块跳转问题

E、代码实现

5.1 自定义注解

/** * Description: 路由跳转界面 注解 * Created by jia on 2018/1/10. * 人之所以能,是相信能 */@Target(ElementType.TYPE) //注解作用于类型(类,接口,注解,枚举)@Retention(RetentionPolicy.RUNTIME) //运行时保留,运行中可以处理@Documented // 生成javadoc文件public @interface Action { String DEFAULT = "js"; String value() default DEFAULT;}

关于自定义注解的详细介绍,请阅读我的文章java进阶之自定义注解。这里不再多说。

5.2 注解Activity

@Action("MainActivity")public class MainActivity extends BaseActivity implements TabLayout.OnTabSelectedListener { ...}

在创建Activity时,用刚刚自定义的注解进行注解,为其注释别名。

5.3 启动时扫描

private void getAllActivities(Context ctx){ try { //通过资源路径获得DexFile DexFile e = new DexFile(ctx.getPackageResourcePath()); Enumeration entries = e.entries(); //遍历所有元素 while(entries.hasMoreElements()) { String entryName = (String)entries.nextElement(); //匹配Activity包名与类名 if(entryName.contains("activity") && entryName.contains("Activity")) { //通过反射获得Activity类 Class entryClass = Class.forName(entryName); if(entryClass.isAnnotationPresent(Action.class)) { Action action = (Action)entryClass.getAnnotation(Action.class); this.map.put(action.value(), entryClass); } } } } catch (Exception e) { e.printStackTrace(); }}

在应用启动时,Application中对包下的所有类进行扫描,先找到名字中到activity的(定义到activity包下),并将带有注解标注的Activity,存入map中。

5.4 跳转

/** * 页面跳转 * @param activity * @param alias */public void jumpActivity(Activity activity, String alias) throws ClassNotFoundException{ if(map.containsKey(alias)) { Intent intent = new Intent(activity, map.get(alias)); activity.startActivity(intent); } else { throw new ClassNotFoundException(); }}

跳转的时候传入目标Activity的别名即可(这里的别名就是注解的别名)。

总结

通过这种方式,解决了跳转Activity所产生的的模块依赖问题,相较于原生方案,拓展性更强。但这种方案只是阶段性的,还存在一些问题。首先,加载过程中,频繁使用到反射,会产生性能问题。其次,对于每个Activity的别名,需要进行统一维护,增加了协作成本。还有待优化。

当然,市面上有很多流行的Router方案(如阿里的ARouter),这里只是介绍了一个思路,有好的建议欢迎交流,一起进步。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

有关Material在Angular2中的使用(详细教学)

在 Angular中 使用Lodash方法具体该怎么做?

vue-router项目实战(详细教学)

在js中如何实现控制文件拖拽并获取拖拽内容功能


推荐阅读
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • mui框架offcanvas侧滑超出部分隐藏无法滚动如何解决
    web前端|js教程off-canvas,部分,超出web前端-js教程mui框架中off-canvas侧滑的一个缺点就是无法出现滚动条,因为它主要用途是设置类似于qq界面的那种格 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • PHPMailer邮件类邮件发送功能的使用教学及注意事项
    本文介绍了使用国外开源码PHPMailer邮件类实现邮件发送功能的简单教学,同时提供了一些注意事项。文章涵盖了字符集设置、发送HTML格式邮件、群发邮件以及避免类的重定义等方面的内容。此外,还提供了一些与PHP相关的资源和服务,如传奇手游游戏源码下载、vscode字体调整、数据恢复、Ubuntu实验环境搭建、北京爬虫市场、进阶PHP和SEO人员需注意的内容。 ... [详细]
  • 在IDEA中运行CAS服务器的配置方法
    本文介绍了在IDEA中运行CAS服务器的配置方法,包括下载CAS模板Overlay Template、解压并添加项目、配置tomcat、运行CAS服务器等步骤。通过本文的指导,读者可以轻松在IDEA中进行CAS服务器的运行和配置。 ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • 旁路|发生_Day749.旁路缓存:Redis是如何工作的Redis 核心技术与实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Day749.旁路缓存:Redis是如何工作的-Redis核心技术与实战相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Linux下部署Symfoy2对app/cache和app/logs目录的权限设置,symfoy2logs
    php教程|php手册xml文件php教程-php手册Linux下部署Symfoy2对appcache和applogs目录的权限设置,symfoy2logs黑色记事本源码,vsco ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
author-avatar
恨透这一切_249
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有