ページジャンプの問題はモジュール開発プロジェクトにおいて非常に重要です。この記事では、主にモジュール間でのページジャンプを解決するルーターの例を紹介します。参照。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。
1. はじめに
モジュラー開発プロジェクトを開始した後、非常に重要な問題はページジャンプの問題です。
モジュラー開発の詳細については、私の他の記事「Android モジュラー開発の探求」を参照してください。
プロジェクトがモジュールに分割されているため、モジュール間に依存関係がなく、モジュール同士が見えないため、モジュール A のインターフェイス a からモジュール B のインターフェイス b にジャンプする場合はどうすればよいでしょうか。
2. モジュール間のジャンプ方法
ここでは、まずこれらの一般的なジャンプ方法を紹介します:
暗黙的なジャンプ
スキームプロトコルジャンプ
に移動ルータールーティングテーブル ソリューション
ディスプレイ ジャンプは、最も一般的に使用されるジャンプ メソッドです。インテントを使用し、現在のアクティビティ コンテキストとターゲット アクティビティのクラス オブジェクトを渡します。次のようにはい。
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スキームジャンプ
マニフェスト ファイルで、データ属性を構成し、そのホストとパス、スキームなど。
<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 ソリューションを採用する必要があります。
アイデアは次のとおりです:
アノテーションを使用して、各ターゲット アクティビティにエイリアスを付けます。アプリケーションが起動すると、すべてのクラスがスキャンされ、注釈付きアクティビティがルーティング テーブルに保存されます。
ジャンプする際は、ルーティングテーブルのエイリアスを通じて対象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; }
@Action("MainActivity") public class MainActivity extends BaseActivity implements TabLayout.OnTabSelectedListener { ... }
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(); } }
/** * 页面跳转 * @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がテキストをクリックしてページジャンプ機能を実現します
以上がルーターはクロスモジュールでのページジャンプを解決しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。