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

标签 java android android-intent deep-linking

这个问题与深层链接有关。例如,我的应用程序中有四个 Activity ,分别是 MainActivityFirstActivitySecondActivityDeepLinkActivity。以下是 list 文件中的 Activity 。

<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深层链接→FirstActivity打开。
  2. 用户最小化应用程序,然后单击 launch://secondSecondActivityFirstActivity 之上打开。
  3. 用户再次最小化应用程序,然后单击 launch://first

在第 3 步之后,我期望操作系统打开 FirstActivity。但实际上它恢复了任务,因此 SecondActivity(来自第 2 步)重新出现。发生这种情况是因为第 1 步和第 3 步的深层链接相同,因此操作系统将它们视为相同的 Intent。

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

最佳答案

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

在开始之前为 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

关于java - 如果新 Intent 与启动应用程序的初始 Intent 相同,则阻止 Android 系统恢复任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37358185/

相关文章:

java - 如何在 JComboBox 中正确渲染我自己的类?

java - 什么属于Controller层,什么属于Service层?

java - 为什么我对这个长二进制数使用 Long.parseLong(String s, int radix) 会冒犯 Java?

java - 更改 ExpandableListView 中指示器的位置导致问题

android - 在不扩展 Activity 类的类中使用 Intent

java - 使用 retryWhen() 重试 observable

java - 淡入/淡出功能

Android通知 Intent 自行清除

android - Intent.getExtras.getInt() 与intent.getIntExtra() 相同吗?

android - 如何在两个 Activity 之间传递字符串