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:
Sprung anzeigen
Impliziter Sprung
Schemaprotokollsprung
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 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>
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 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>
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);
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; }
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 { ... }
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 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(); } }
Ü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!