Heim > Web-Frontend > js-Tutorial > Der Router löst Seitensprünge unter Modulübergreifend

Der Router löst Seitensprünge unter Modulübergreifend

小云云
Freigeben: 2018-01-13 09:24:30
Original
1653 Leute haben es durchsucht

Das Seitensprungproblem ist in modularen Entwicklungsprojekten sehr wichtig. Ich denke, es ist ziemlich gut Referenz. Folgen wir dem Herausgeber und schauen wir uns das an. Ich hoffe, es kann allen helfen.

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 „Exploring Android Modular Development“.

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);
Nach dem Login kopieren

Natürlich kann diese Methode nur für die Zielaktivität sichtbar sein (Aktivität befindet sich unter demselben Modul) und kann nur so aufgerufen werden. 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>
Nach dem Login kopieren

Beim Springen:


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

2.3 Schemasprung

Wenn wir einen URI für Seite B definieren – wsc://home/bbb, und dann das gemeinsam genutzte messageModel in einen Json-String serialisieren, Dann 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 seinen Host, seinen Pfad, sein 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>
Nach dem Login kopieren

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);
Nach dem Login kopieren

Die Die obige Methode ist nicht 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 ernsthaften 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;

}
Nach dem Login kopieren

Eine ausführliche Einführung in benutzerdefinierte Annotationen finden Sie in meinem 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 {

  ...
}
Nach dem Login kopieren

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();
  }
}
Nach dem Login kopieren

Wenn die Anwendung startet, werden alle Klassen unter dem Paket in der Anwendung gescannt. Suchen Sie zunächst die Aktivität in Namen (definiert unter dem Aktivitätspaket) und speichern Sie die Aktivität mit Anmerkungen in der Karte.

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();
  }
}
Nach dem Login kopieren

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

Verwandte Empfehlungen:

vue implementiert den Seitensprung zur vorherigen Seite nach dem Teilen von Anmeldebeispielen

WeChat Xiaochen-Klicktext Methoden zum Implementieren der Seitensprungfunktion

HTML-Seitensprung und Probleme bei der Parameterübergabe


Das obige ist der detaillierte Inhalt vonDer Router löst Seitensprünge unter Modulübergreifend. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage