如果新 Intent 与启动应用程序的初始 Intent 相同,则阻止 Android 系统恢复任务

Prevent Android system from resuming task if the new Intent is the same with initial Intent that launches the app

这个问题与深度link有关。例如,我的应用程序中有四个活动,即 MainActivityFirstActivitySecondActivityDeepLinkActivity。以下是清单文件中的活动。

<activity android:name=".MainActivity">
    <intent-filter>
       <action android:name="android.intent.action.MAIN" />
       <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity android:name=".FirstActivity" />
<activity android:name=".SecondActivity" />
<activity android:name=".DeepLinkActivity"
    android:theme="@android:style/Theme.NoDisplay">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="launch" />
    </intent-filter>
</activity>

DeepLinkActivity 将根据收到的 URI FirstActivitySecondActivityMainActivity 启动:

public class DeepLinkActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        launchIntent(getIntent());
    }

    private void launchIntent(Intent intent) {
        Intent newIntent = null;

        switch (intent.getData().getHost()) {
            case "first":
                newIntent = new Intent(this, FirstActivity.class);
                break;
            case "second":
                newIntent = new Intent(this, SecondActivity.class);
                break;
            default:
                newIntent = new Intent(this, MainActivity.class);
                break;
        }

        startActivity(newIntent);
        finish();
    }
}

问题是,Android 系统似乎记录了启动应用程序的初始 Intent,然后用它来恢复前台 Activity 当前 运行 中的任何内容 -if- 新 Intent 与初始 Intent 相同。

考虑以下情况:

  1. 用户点击launch://first深link→FirstActivity打开
  2. 用户最小化应用程序然后单击 launch://secondSecondActivityFirstActivity 之上打开。
  3. 用户再次最小化应用程序然后单击 launch://first

在第 3 步之后,我期望的是 OS 打开 FirstActivity。但实际上它恢复了任务,所以 SecondActivity (来自第 2 步)重新出现。发生这种情况是因为步骤 1 和步骤 3 中的深度 link 相同,因此 OS 将它们视为相同的 Intent。

如何防止 Android 系统在这种特殊情况下恢复任务?

您可以尝试在 Activities OnPause 函数上定义一些内容,以便在每次 activity 暂停时重置意图。

经过一些试验后,我就是这样做的。

在启动前为 newIntent 设置标志:

newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

然而,单独设置标志并没有完成工作,应用程序仍然恢复到最后 activity。然后我将 launchMode 添加到 DeepLinkActivity:

<activity android:name=".DeepLinkActivity"
    android:theme="@android:style/Theme.NoDisplay"
    android:launchMode="singleTask">

现在应用程序已重新启动并打开预期 activity!请注意,launchMode 也可以是 singleInstance