ホームページ  >  記事  >  ウェブフロントエンド  >  ルーターのクロスモジュールジャンプの問題を解決する方法

ルーターのクロスモジュールジャンプの問題を解決する方法

亚连
亚连オリジナル
2018-06-12 16:16:232046ブラウズ

モジュール開発プロジェクトを開始した後、非常に重要な問題はページジャンプの問題です。この記事では主に、クロスモジュールでのページジャンプを解決するルーターの例を紹介します。

1. はじめに

モジュラー開発プロジェクトを開始した後、非常に重要な問題はページジャンプの問題です。

モジュラー開発の詳細については、私の他の記事「Android モジュラー開発の探求」を参照してください。

プロジェクトがモジュールに分割されているため、モジュール間に依存関係がなく、モジュール同士が見えないため、モジュール A のインターフェイス a からモジュール B のインターフェイス b にジャンプする場合はどうすればよいでしょうか。

2. モジュール間のジャンプ方法

ここでは、まずこれらの一般的なジャンプ方法を紹介します:

  1. 暗黙的なジャンプ

  2. スキームプロトコルジャンプ

  3. に移動ルータールーティングテーブル ソリューション

  4. 2.1 ディスプレイ ジャンプ

ディスプレイ ジャンプは、最も一般的に使用されるジャンプ メソッドです。インテントを使用し、現在のアクティビティ コンテキストとターゲット アクティビティのクラス オブジェクトを渡します。次のようにはい。 , このメソッドは、ターゲットのアクティビティが表示されている場合 (アクティビティが同じモジュールの下にある場合) にのみ呼び出すことができます。モジュール間のジャンプには適していません。

2.2 暗黙的ジャンプ

ここで話している暗黙的ジャンプ、インテントはクラスを設定するのではなく、アクションまたはカテゴリを設定します。

例: マニフェストファイル内

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

ジャンプ時:

<!--网页展示界面-->
<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>

2.3スキームジャンプ

BページのURIを定義した場合 - wsc://home/bbb messageModel Json 文字列にシリアル化した後、A は B ページ スキームに準拠するジャンプ プロトコルをアセンブルするだけで済みます。 wsc://home/bbb?message={ "name":"John", "age":31, "city":"New York" }

マニフェスト ファイルで、データ属性を構成し、そのホストとパス、スキームなど。

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

<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>

上記の方法はどれも私たちが望むものではありません。 次に、ルーター ソリューションを紹介します。

3. Router を使用する理由

Google は、明示的と暗黙的という 2 つのネイティブ ルーティング ソリューションを提供しています。ただし、モジュール開発では、明示的なインテントがクラスに直接依存するという問題があり、モジュール間の深刻な結合が発生します。暗黙的インテントでは、マニフェストで多数のパスを構成する必要があるため、拡張が困難になります (ジャンプ インターセプトなど)。上記の問題を解決するには、より柔軟な Router ソリューションを採用する必要があります。

4. 実装のアイデア

アイデアは次のとおりです:

アノテーションを使用して、各ターゲット アクティビティにエイリアスを付けます。アプリケーションが起動すると、すべてのクラスがスキャンされ、注釈付きアクティビティがルーティング テーブルに保存されます。 ジャンプする際は、ルーティングテーブルのエイリアスを通じて対象Activityのクラスオブジェクトを取得し、Intentを利用してジャンプを実装します。

5. コードの実装

5.1 カスタム アノテーション

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);

カスタム アノテーションの詳細については、私の記事「Java Advanced Custom Annotations」を参照してください。ここではこれ以上言うことはありません。 5.2 アクティビティに注釈を付ける

/**
 * 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;

}

アクティビティを作成するときに、カスタマイズした注釈を使用して注釈を付け、エイリアスを使用して注釈を付けます。

5.3 起動時のスキャン

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

  ...
}

アプリケーションが起動すると、パッケージ内のすべてのクラスがアプリケーション内でスキャンされます。まず、(アクティビティ パッケージで定義された) 名前でアクティビティを検索し、アノテーションを付けてアクティビティをマップに保存します。 。

5.4 ジャンプ

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();
  }
}

ジャンプするときにターゲットのアクティビティのエイリアスを渡すだけです (ここでのエイリアスはアノテーションのエイリアスです)。

概要

このようにして、Activityのジャンプによって引き起こされるモジュールの依存関係の問題が解決され、ネイティブソリューションと比較してよりスケーラブルになります。しかし、この計画は段階的なものであり、まだいくつかの問題があります。まず、読み込みプロセス中にリフレクションを頻繁に使用すると、パフォーマンスの問題が発生します。次に、各アクティビティのエイリアスを均一に維持する必要があるため、コラボレーションのコストが増加します。まだ最適化する必要があります。

もちろん、市場には多くの人気のあるルーター ソリューションがあります (Alibaba の ARouter など)。ここで紹介するのは単なるアイデアです。良い提案があれば、ぜひ交換して一緒に進歩してください。 上記は私があなたのためにまとめたものです。

関連記事:

Angular2でのマテリアルの使用について(詳細なチュートリアル)

AngularでLodashメソッドを使用するには?

vue-routerプロジェクトの実践(詳細なチュートリアル)

jsでファイルのドラッグを制御し、ドラッグコンテンツ関数を取得する方法

以上がルーターのクロスモジュールジャンプの問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。