Android 深度 link 当我重新打开应用程序时再次发送

Android deep link delivered again when I reopen the app

我在我的应用程序中使用 deep links

这是我的activity清单

<activity
    android:name=".ui.MainActivity"
    android:exported="true"
    android:launchMode="singleTask"
    android:screenOrientation="portrait"
    android:theme="@style/AppTheme.NoActionBar.Launcher">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:host="app.mydomain.com"
            android:pathPrefix="/prefix"
            android:scheme="https" />
    </intent-filter>
</activity>

这就是我深入的方式link

Uri uri = getIntent().getData();

在我处理完深度 link 和 MainActivity 中的一些其他逻辑后,我将用户导航到其他 activity,并完成 MainActivity.

问题是,在某些情况下,我一遍又一遍地深入 link。这是发生问题的场景:

  1. 我点击 link 时,我的应用程序不在内存中,也没有通过点击系统后退按钮关闭。

  2. 在我的应用程序中处理 link 后,我使用系统后退按钮关闭应用程序。

  3. 然后我通过单击菜单中的预览(不是启动器图标)打开应用程序,所有应用程序都在内存中(通过单击 phone 上的一个系统按钮打开)。并且deeplink再次送达

问题是,当 link 交付时我无法确定,是这种特殊的问题案例场景,我应该忽略 link,还是用户实际点击了 link,我应该处理它。

将 link 保存在静态变量中以检查是否相同 link 并不好,因为用户可能会再次单击相同的 link 以查看相同的数据。

问题也存在于 Firebase Dynamic Links

我的 phone 在 Android 12(api 31 级)、三星 S21

上运行

找到了解决方法,多亏了这个answer

我检查 activity 是否使用此方法从历史记录中启动,如果为真,那么我将忽略 deep link

private boolean isActivityLaunchedFromHistory() {
    return getIntent().getFlags() ==
                (Intent.FLAG_ACTIVITY_NEW_TASK 
               | Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
    }