首页 web前端 js教程 Router解决跨模块下的页面跳转

Router解决跨模块下的页面跳转

Jan 13, 2018 am 09:24 AM
router 解决 页面

模块化开发项目中页面跳转问题很重要,本文主要介绍了Router解决跨模块下的页面跳转示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

一、前言

开始模块化开发项目之后,一个很重要的问题就是页面见的跳转问题。

关于模块化发开,可详见我的另一片文章 Android模块化开发探索 。

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

二、跨模块跳转的方法

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

  1. 显示跳转

  2. 隐示跳转

  3. Scheme协议跳转

  4. 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。

例如:

在清单文件中


<!--网页展示界面-->
<activity
  android:name="com.whaty.base.BaseWebViewActivity"
  android:hardwareAccelerated="true">
    <intent-filter>
      <category android:name="android.intent.category.DEFAULT" />
      <action android:name="com.whaty.base.BaseWebViewActivity" />
    </intent-filter>
</activity>
登录后复制

跳转时:


//创建一个隐式的 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等


<activity android:name=".ui.BbbActivity"
  <intent-filter>
    <category android:name="android.intent.category.DEFAULT" />
    <action android:name="android.intent.action.VIEW" />
    <data
      android:host="bbb"
      android:path="/home"
      android:scheme="wsc" />
  </intent-filter>
</activity>
登录后复制

跳转时:


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方案。

三、为什么要用Router

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

四、实现思路

思路是这样的:

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

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

五、代码实现

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),这里只是介绍了一个思路,有好的建议欢迎交流,一起进步。

相关推荐:

vue实现登录后页面跳转到之前页面实例分享

微信小程点击文字实现页面跳转功能的方法

HTML页面跳转及参数传递问题


以上是Router解决跨模块下的页面跳转的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Win11系统无法安装中文语言包的解决方法 Win11系统无法安装中文语言包的解决方法 Mar 09, 2024 am 09:48 AM

Win11系统无法安装中文语言包的解决方法随着Windows11系统的推出,许多用户开始升级他们的操作系统以体验新的功能和界面。然而,一些用户在升级后发现他们无法安装中文语言包,这给他们的使用体验带来了困扰。在本文中,我们将探讨Win11系统无法安装中文语言包的原因,并提供一些解决方法,帮助用户解决这一问题。原因分析首先,让我们来分析一下Win11系统无法

五招教你解决黑鲨手机开不了机的问题! 五招教你解决黑鲨手机开不了机的问题! Mar 24, 2024 pm 12:27 PM

随着智能手机技术的不断发展,手机在我们日常生活中扮演着越来越重要的角色。而作为一款专注于游戏性能的旗舰手机,黑鲨手机备受玩家青睐。然而,有时候我们也会面临到黑鲨手机开不了机的情况,这时候我们就需要采取一些措施来解决这一问题。接下来,就让我们来分享五招教你解决黑鲨手机开不了机的问题:第一招:检查电池电量首先,确保你的黑鲨手机有足够的电量。可能是因为手机电量耗尽

小红书发布自动保存图片怎么解决?发布自动保存图片在哪里? 小红书发布自动保存图片怎么解决?发布自动保存图片在哪里? Mar 22, 2024 am 08:06 AM

随着社交媒体的不断发展,小红书已经成为越来越多年轻人分享生活、发现美好事物的平台。许多用户在发布图片时遇到了自动保存的问题,这让他们感到十分困扰。那么,如何解决这个问题呢?一、小红书发布自动保存图片怎么解决?1.清除缓存首先,我们可以尝试清除小红书的缓存数据。步骤如下:(1)打开小红书,点击右下角的“我的”按钮;(2)在个人中心页面,找到“设置”并点击;(3)向下滚动,找到“清除缓存”选项,点击确认。清除缓存后,重新进入小红书,尝试发布图片看是否解决了自动保存的问题。2.更新小红书版本确保你的小

无法在此设备上加载驱动程序怎么解决?(亲测有效) 无法在此设备上加载驱动程序怎么解决?(亲测有效) Mar 14, 2024 pm 09:00 PM

  大家都知道,如果电脑无法加载驱动程序,该设备可能就无法正常工作或与计算机进行正确的交互。那在电脑上弹出无法在此设备上加载驱动程序的提示框,我们要如何解决呢?下面小编就教大家两招轻松解决问题。  无法在此设备上加载驱动程序解决方法  1、开始菜单搜索“内核隔离”。  2、将内存完整性关闭,上方提示“内存完整性已关闭。你的设备可能易受攻击。”点击后方忽略即可,不会对使用有影响。  3.重启机器之后即可解决问题。

Linux中文乱码怎么解决 Linux中文乱码怎么解决 Feb 21, 2024 am 10:48 AM

Linux中文乱码问题是使用中文字符集和编码时常见的一个问题。出现乱码的原因可能是文件编码设置不正确,系统语言环境未安装或未设置,以及终端显示配置错误等。本文将介绍几种常见的解决方法,并提供具体的代码示例。一、检查文件编码设置使用file命令查看文件编码在终端中使用file命令,可以查看文件的编码:file-ifilename如果输出中有"charset

解决PyCharm无法打开的方法分享 解决PyCharm无法打开的方法分享 Feb 22, 2024 am 09:03 AM

标题:如何解决PyCharm无法打开的问题PyCharm是一款功能强大的Python集成开发环境,但有时候我们可能会遇到无法打开PyCharm的问题。在本文中,我们将分享一些常见的解决方法,并提供具体的代码示例。希望能帮助到遇到这个问题的小伙伴们。方法一:清除缓存有时候PyCharm的缓存文件可能会导致程序无法正常打开,我们可以尝试清除缓存来解决这个问题。具

如何解决默认网关自动消失的问题 如何解决默认网关自动消失的问题 Feb 24, 2024 pm 04:18 PM

默认网关自动消失怎么解决在现代社会中,互联网已经成为人们生活中不可或缺的一部分。无论是工作还是娱乐,我们都需要稳定的网络连接来完成各种任务。而默认网关是连接本地网络与外部互联网的关键要素之一。然而,有时我们可能会遇到默认网关自动消失的问题,导致无法上网。那么,当默认网关消失时,我们应该如何解决这个问题呢?首先,我们应该明确默认网关的概念。默认网关是一个网络路

华为浏览器已停止访问该网页怎么解决 华为浏览器已停止访问该网页怎么解决 Feb 26, 2024 pm 01:28 PM

华为浏览器已停止访问该网页怎么解决?在使用华为手机浏览器访问某些网站时,可能会出现禁止访问的提示,使用户无法正常浏览相关内容。这对用户而言非常不便。那么,当我们遇到华为手机浏览器网站禁止访问的情况时,该怎么办呢?下面小编将为您提供华为浏览器网站禁止访问解决方法,希望对您有所帮助。华为浏览器网站禁止访问解决方法1、打开华为手机浏览器后,点击下方的三点图标,然后点击设置。2、进入设置后,点击【安全与隐私】3、将【安全浏览】右侧的开关关闭,即可解除网站访问限制。以上便是华为浏览器网站禁止访问解决方法的

See all articles