ルーターはクロスモジュールでのページジャンプを解決します

小云云
リリース: 2018-01-13 09:24:30
オリジナル
1603 人が閲覧しました

ページジャンプの問題はモジュール開発プロジェクトにおいて非常に重要です。この記事では、主にモジュール間でのページジャンプを解決するルーターの例を紹介します。参照。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。

1. はじめに

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

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

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

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

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

  1. 暗黙的なジャンプ

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

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

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

ディスプレイ ジャンプは、最も一般的に使用されるジャンプ メソッドです。インテントを使用し、現在のアクティビティ コンテキストとターゲット アクティビティのクラス オブジェクトを渡します。次のようにはい。

Intent intent = new Intent();
intent.setClass(mContext, GuideActivity.class);
startActivity(intent);
ログイン後にコピー
明らかに、このメソッドは、ターゲットのアクティビティが表示されている(アクティビティが同じモジュールの下にある)場合にのみ呼び出すことができます。モジュール間のジャンプには適していません。

2.2 暗黙的ジャンプ


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

例:

マニフェストファイル内

<!--网页展示界面-->
<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スキームジャンプ

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


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

<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);
ログイン後にコピー

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

3. Router を使用する理由


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

4. 実装のアイデア

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

アノテーションを使用して、各ターゲット アクティビティにエイリアスを付けます。アプリケーションが起動すると、すべてのクラスがスキャンされ、注釈付きアクティビティがルーティング テーブルに保存されます。

ジャンプする際は、ルーティングテーブルのエイリアスを通じて対象Activityのクラスオブジェクトを取得し、Intentを利用してジャンプを実装します。

5. コードの実装

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 Advanced Custom Annotations」を参照してください。ここではこれ以上言うことはありません。

5.2 アクティビティに注釈を付ける


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

  ...
}
ログイン後にコピー

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

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();
  }
}
ログイン後にコピー

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

5.4 Jump


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

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

関連する推奨事項:

Vueはログイン後に前のページへのページジャンプを実現します。共有例

WeChat Xiaochengがテキストをクリックしてページジャンプ機能を実現します

HTMLページジャンプとパラメータの受け渡し問題

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!