Heim  >  Artikel  >  Web-Frontend  >  So lösen Sie das Problem des Router-übergreifenden Modulsprungs

So lösen Sie das Problem des Router-übergreifenden Modulsprungs

亚连
亚连Original
2018-06-12 16:16:232047Durchsuche

Nach dem Start eines modularen Entwicklungsprojekts ist das Seitensprungproblem ein sehr wichtiges Thema. In diesem Artikel wird hauptsächlich das Beispiel des Routers vorgestellt, der den Seitensprung unter Modulübergreifend löst. beziehen sich auf.

1. Einführung

Nach dem Start eines modularen Entwicklungsprojekts ist das Seitensprungproblem ein sehr wichtiges Problem.

Weitere Informationen zur modularen Entwicklung finden Sie in meinem anderen Artikel: Erkundung der modularen Android-Entwicklung.

Gerade weil das Projekt in Module unterteilt ist, besteht keine Abhängigkeit zwischen den Modulen und sie sind füreinander unsichtbar. Was sollen wir also tun, wenn wir von Schnittstelle a von Modul A zu Schnittstelle b von wechseln? Modul B?

2. Modulübergreifende Sprungmethoden

Hier stellen wir zunächst diese gängigen Sprungmethoden vor:

  1. Sprung anzeigen

  2. Impliziter Sprung

  3. Schemaprotokollsprung

  4. Router-Routing-Tabellenlösung

2.1 Anzeigesprung

Anzeigesprung ist unsere am häufigsten verwendete Sprungmethode: Verwenden Sie Absicht und Übergabe im aktuellen Aktivitätskontext und im Klassenobjekt der Zielaktivität genug, wie folgt:

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

Natürlich kann diese Methode nur aufgerufen werden, wenn die Zielaktivität sichtbar ist (die Aktivität befindet sich unter demselben Modul). Nicht zum Springen zwischen Modulen geeignet.

2.2 Impliziter Sprung

Der implizite Sprung, von dem wir hier sprechen, besteht darin, dass die Absicht keine Klasse, sondern eine Aktion oder Kategorie festlegt.

Zum Beispiel:

In der Manifestdatei

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

beim Springen:

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

2.3 Schemasprung

Wenn wir einen URI für die B-Seite definieren – wsc://home/bbb – und dann das gemeinsam genutzte messageModel in einen Json-String serialisieren, muss A nur ein Sprungprotokoll zusammenstellen, das dem B-Seitenschema entspricht. wsc://home/bbb?message={ „name“:“John“, „age“:31, „city“:“New York“ }

Konfigurieren Sie in der Manifestdatei das Datenattribut und Legen Sie den Host, den Pfad, das Schema usw. fest.

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

beim Springen:

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

Keine der oben genannten Methoden ist das, was wir wollen. Als nächstes stellen wir unsere Router-Lösung vor.

3. Warum Router verwenden?

Google bietet zwei native Routing-Lösungen: explizit und implizit. Bei der modularen Entwicklung besteht jedoch bei explizitem Intent das Problem der direkten Abhängigkeit von Klassen, was zu einer starken Kopplung zwischen Modulen führt. Implizite Absicht erfordert die Konfiguration einer großen Anzahl von Pfaden im Manifest, was eine Erweiterung erschwert (z. B. Sprungabfangen). Um die oben genannten Probleme zu lösen, müssen wir eine flexiblere Router-Lösung einführen.

4. Implementierungsidee

Die Idee ist wie folgt:

Verwenden Sie Anmerkungen, um jede Zielaktivität mit einem Alias ​​zu kennzeichnen. Beim Start der Anwendung werden alle Klassen gescannt und die annotierten Aktivitäten in der Routing-Tabelle gespeichert.

Erhalten Sie beim Springen das Klassenobjekt der Zielaktivität über den Alias ​​in der Routing-Tabelle und implementieren Sie den Sprung mit Intent.

5. Code-Implementierung

5.1 Benutzerdefinierte Anmerkungen

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

}

Detaillierte Einführung in benutzerdefinierte Anmerkungen. Bitte lesen Sie meine Artikel Java Advanced Custom Annotations. Mehr gibt es hier nicht zu sagen.

5.2 Aktivität mit Anmerkungen versehen

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

  ...
}

Wenn Sie eine Aktivität erstellen, kommentieren Sie sie mit der gerade angepassten Anmerkung und versehen Sie sie mit einem Alias.

5.3 Scannen beim Start

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

Wenn die Anwendung startet, werden alle Klassen unter dem Paket in der Anwendung gescannt. Suchen Sie zunächst diejenigen mit Aktivität im Namen (definiert unter dem Aktivitätspaket). Anschließend werden mit Anmerkungen markierte Aktivitäten in der Karte gespeichert.

5.4 Springen

/**
 * 页面跳转
 * @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();
  }
}

Übergeben Sie beim Springen einfach den Alias ​​der Zielaktivität (der Alias ​​hier ist der Alias ​​der Anmerkung).

Zusammenfassung

Auf diese Weise wird das durch das Springen von Aktivitäten verursachte Modulabhängigkeitsproblem gelöst und ist im Vergleich zur nativen Lösung skalierbarer. Dieser Plan ist jedoch nur stufenweise angelegt und es gibt immer noch einige Probleme. Erstens führt die häufige Verwendung von Reflektion während des Ladevorgangs zu Leistungsproblemen. Zweitens muss der Alias ​​jeder Aktivität einheitlich verwaltet werden, was die Kosten der Zusammenarbeit erhöht. Muss noch optimiert werden.

Natürlich gibt es viele beliebte Router-Lösungen auf dem Markt (z. B. ARouter von Alibaba). Wenn Sie gute Vorschläge haben, können Sie sich gerne austauschen und gemeinsam Fortschritte machen.

Ich habe das Obige für Sie zusammengestellt und hoffe, dass es Ihnen in Zukunft hilfreich sein wird.

Verwandte Artikel:

Über die Verwendung von Material in Angular2 (ausführliches Tutorial)

Wie man die Lodash-Methode in Angular Do verwendet ?

Vue-Router-Projektpraxis (ausführliches Tutorial)

So steuern Sie das Ziehen von Dateien und erhalten die Funktion zum Ziehen von Inhalten in js

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem des Router-übergreifenden Modulsprungs. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn