本文對比 Activity 的兩種跳轉方式的利弊。
顯式跳轉
實現
Intent intent = new Intent(mContext, AnotherActivity.class);
startActivity(intent);
優點
- 性能高;
- 可讀性強;
- 目標 Activity 唯一;
缺點
- 產生強耦合
- 目標 Activity 寫死,不夠靈活
隱式跳轉
實現
AndroidManifest.xml
<activity android:name=".AnotherActivity";
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="another"
android:scheme="loveya" />
</activity>
Activity.java
Uri.Builder builder = Uri.parse("loveya://another").buildUpon();
builder.appendQueryParameter("strA", "a");
Intent i = new Intent(Intent.ACTION_VIEW, builder.build());
i.putExtra("intB", 1);
startActivity(i);
優點
- 避免了強耦合;
- 可由後端以字符串形式吐出,靈活可配,比如目標 Activity 出現嚴重故障,通過後端吐空來規避故障;
缺點
- 同一個 scheme 對應多個 Activity 時,跳轉時目標 Activity 不唯一,即使多個 Activity 分佈於多個應用中。
- 由於跳轉不顯示引用目標 Activity,當目標 Activity 被誤刪時 IDE 無法靜態檢查跳轉異常,從而留下隱患,可能導致線上 crash,需要在跳轉處加 try-catch 保證健壯性;
舉個例子。
情景一
手機上裝了兩個應用:A 和 B;
SecondActivity.java 位於應用 A 中,scheme 是 “love://ya”;
ThirdActivity.java 位於應用 B 中,scheme 是 “love://ya”;
在 A 或 B 或 adb start 命令行使用隱式方式跳轉,手機會彈出對話框讓用戶選擇使用 A 還是 B 打開。
情景二
手機上裝了兩個應用:A 和 B;
A 和 B 都引了一個 aar,該 aar 中有一個 AnotherActivity,在 A 或 B 中使用隱式方式跳轉到 AnotherActivity,手機會彈出對話框讓用戶選擇使用 A 還是 B 打開。