Rumah hujung hadapan web tutorial js 如何解决Router跨模块跳转问题

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

Jun 12, 2018 pm 04:16 PM
router Modul silang

开始模块化开发项目之后,一个很重要的问题就是页面见的跳转问题,这篇文章主要介绍了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);
Salin selepas log masuk

显然,这种方法只能是目标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>
Salin selepas log masuk

跳转时:

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

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>
Salin selepas log masuk

跳转时:

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);
Salin selepas log masuk

以上的方法,都不是我们想要的,接下来开始介绍我们的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;

}
Salin selepas log masuk

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

5.2 注解Activity

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

  ...
}
Salin selepas log masuk

在创建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();
  }
}
Salin selepas log masuk

在应用启动时,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();
  }
}
Salin selepas log masuk

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

总结

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

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

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

相关文章:

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

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

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

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

Atas ialah kandungan terperinci 如何解决Router跨模块跳转问题. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Panduan Pengguna Penghala React: Cara melaksanakan kawalan penghalaan bahagian hadapan Panduan Pengguna Penghala React: Cara melaksanakan kawalan penghalaan bahagian hadapan Sep 29, 2023 pm 05:45 PM

Panduan Pengguna ReactRouter: Cara Melaksanakan Kawalan Penghalaan Hadapan Dengan populariti aplikasi satu halaman, penghalaan bahagian hadapan telah menjadi bahagian penting yang tidak boleh diabaikan. Sebagai perpustakaan penghalaan paling popular dalam ekosistem React, ReactRouter menyediakan fungsi yang kaya dan API yang mudah digunakan, menjadikan pelaksanaan penghalaan bahagian hadapan sangat mudah dan fleksibel. Artikel ini akan memperkenalkan cara menggunakan ReactRouter dan menyediakan beberapa contoh kod khusus. Untuk memasang ReactRouter dahulu, kita perlukan

Bagaimana untuk memanggil fungsi dalam modul yang berbeza dalam C++? Bagaimana untuk memanggil fungsi dalam modul yang berbeza dalam C++? Apr 12, 2024 pm 03:54 PM

Memanggil fungsi merentas modul dalam C++: Isytihar fungsi: Isytiharkan fungsi yang akan dipanggil dalam fail pengepala modul sasaran. Laksanakan fungsi: Laksanakan fungsi dalam fail sumber. Memautkan modul: Gunakan pemaut untuk memautkan bersama modul yang mengandungi pengisytiharan dan pelaksanaan fungsi. Panggil fungsi: Sertakan fail pengepala modul sasaran dalam modul yang perlu dipanggil, dan kemudian panggil fungsi tersebut.

Kelebihan unik penghalaan Vue Router Lazy-Loading, bagaimana untuk mengoptimumkan prestasi halaman? Kelebihan unik penghalaan Vue Router Lazy-Loading, bagaimana untuk mengoptimumkan prestasi halaman? Sep 15, 2023 am 10:36 AM

VueRouter ialah pemalam pengurusan penghalaan yang disediakan secara rasmi oleh Vue.js Ia boleh membantu kami melaksanakan navigasi halaman dan penukaran laluan dalam aplikasi Vue. Ciri Lazy-Loading ialah kelebihan unik VueRouter, yang boleh mengoptimumkan prestasi halaman dengan sangat baik. Dalam artikel ini, kami akan memperkenalkan ciri penghalaan Lazy-Loading VueRouter dan menyediakan beberapa contoh kod praktikal untuk mengoptimumkan prestasi halaman. Lazy-Loading bermaksud apabila diperlukan

Apakah yang perlu saya lakukan jika penghala tindak balas tidak dipaparkan? Apakah yang perlu saya lakukan jika penghala tindak balas tidak dipaparkan? Dec 30, 2022 am 09:30 AM

Penyelesaian untuk bertindak balas penghala tidak dipaparkan: 1. Tambahkan browserRouter ke komponen penghalaan induk untuk membalut penghala 2. Gunakan "this.props.history.go()" untuk memuat semula komponen; 3. Tambahkan "forcerefresh" pada parameter browser; ={true}"; 4. Tulis fungsi cangkuk dalam "<Laluan>" dan panggilnya apabila meninggalkan atau memasuki laluan ini.

Vue Router Lazy-Loading routing: trend untuk membantu meningkatkan prestasi halaman Vue Router Lazy-Loading routing: trend untuk membantu meningkatkan prestasi halaman Sep 15, 2023 am 08:03 AM

VueRouter ialah pengurus laluan rasmi dalam rangka kerja Vue.js. Ia membolehkan pembangun menukar kandungan halaman melalui pemetaan laluan, menjadikan aplikasi satu halaman lebih terkawal dan lebih mudah untuk diselenggara. Walau bagaimanapun, apabila aplikasi menjadi lebih kompleks, pemuatan dan penghuraian laluan boleh menjadi kesesakan prestasi. Untuk menyelesaikan masalah ini, VueRouter menyediakan fungsi pemuatan malas laluan, yang menangguhkan pemuatan laluan sehingga benar-benar diperlukan. Lazy-loading adalah teknologi pemuatan yang

Cara menggunakan penghalaan penghala untuk melaksanakan parameter lompat dalam vue3 Cara menggunakan penghalaan penghala untuk melaksanakan parameter lompat dalam vue3 May 16, 2023 am 10:49 AM

1. Lompat laluan 1. Mula-mula perkenalkan API—useRouterimport{useRouter}from'vue-router'2 Tentukan pembolehubah penghala pada halaman lompat // Mula-mula tentukan constrouter=useRouter() dalam persediaan 3. Gunakan router.push to. lompat ke halaman //String router.push('home')//Object router.push({path:'home'})//

Cara menggunakan Penghala untuk melaksanakan fungsi pengalihan dalam projek Vue Cara menggunakan Penghala untuk melaksanakan fungsi pengalihan dalam projek Vue Sep 15, 2023 am 08:36 AM

Cara menggunakan Router untuk melaksanakan fungsi ubah hala dalam projek Vue Dalam projek Vue, kita selalunya perlu melaksanakan fungsi lompat dan ubah hala antara halaman. VueRouter menyediakan penyelesaian yang mudah tetapi berkuasa. Artikel ini akan memperkenalkan cara menggunakan Penghala untuk melaksanakan fungsi ubah hala dalam projek Vue dan memberikan contoh kod khusus. Pasang VueRouter Pertama, kita perlu memasang VueRouter dalam projek Vue. boleh

Bagaimanakah pemuatan malas laluan dilaksanakan dalam Penghala Vue? Bagaimanakah pemuatan malas laluan dilaksanakan dalam Penghala Vue? Jul 21, 2023 am 10:40 AM

Bagaimanakah pemuatan malas laluan dilaksanakan dalam VueRouter? Dalam pembangunan Vue, kami biasanya menggunakan VueRouter untuk melaksanakan lompatan dan kawalan penghalaan antara halaman. Apabila projek menjadi besar, kami mungkin mempunyai banyak halaman penghalaan untuk dimuatkan, yang akan menyebabkan keseluruhan projek dimuatkan dengan perlahan. Untuk meningkatkan prestasi projek, VueRouter menyediakan mekanisme untuk memuatkan laluan yang malas. Pemuatan laluan yang malas bermakna halaman penghalaan akan dimuatkan hanya apabila ia diakses, bukannya memuatkan semua laluan apabila aplikasi dimulakan.

See all articles