Activity 显式和隐式跳转利弊对比

本文对比 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 打开。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章