Android活动启动模式和deeplink问题

Android活动启动模式和deeplink问题,android,deep-linking,launchmode,Android,Deep Linking,Launchmode,我的应用程序有两个活动。 应用程序的根活动是main活动。如果凭据丢失或无效,用户将在完成Main活动时重定向到LoginActivity 如果我将主活动的启动模式设置为singleTask,并且我处于LoginActivity=>最小化应用程序->从启动器图标启动应用程序=>的内部片段中,则主活动将启动(因为它是singleTask活动)并重定向到LoginActivity,但当然会重定向到堆栈中的第一个片段 想要的行为(当从最近重新启动时)是,它将保留当前活动的实例,并在LoginActiv

我的应用程序有两个活动。 应用程序的根活动是main活动。如果凭据丢失或无效,用户将在完成Main活动时重定向到LoginActivity

如果我将主活动的启动模式设置为singleTask,并且我处于LoginActivity=>最小化应用程序->从启动器图标启动应用程序=>的内部片段中,则主活动将启动(因为它是singleTask活动)并重定向到LoginActivity,但当然会重定向到堆栈中的第一个片段

想要的行为(当从最近重新启动时)是,它将保留当前活动的实例,并在LoginActivity的堆栈中显示正确的片段

这当然可以通过将启动模式设置为singleTop轻松解决,但随后会出现另一个问题!DeepLink麻烦了

如果我的应用程序在后台打开,并且我在单顶模式下单击浏览器或电子邮件中的链接,则该应用程序将作为转发应用程序的子任务打开(如果单击“最近”,您将看到您的应用程序打开两次,一次作为以前存在的常规实例,另一次作为浏览器/电子邮件中的一个实例)。 当然,这非常不方便,可以通过将启动模式设置为singleTask来解决

在此问题上的任何帮助都将不胜感激

   <!-- Main Activity -->
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:launchMode="singleTask"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <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:host="somehost"
                android:scheme="myscheme" />
        </intent-filter>
    </activity>

    <!-- Login Activity -->
    <activity
        android:name="LoginActivity"
        android:launchMode="singleTask"
        android:screenOrientation="portrait" />

多亏了orelzion的提示,我成功地解决了这个问题:

我确实创建了一个新的DeepLinkActivity,它启动了MainActivity(我将启动模式从“singleTask”更改为“singleTop”),并带有以下标志:

Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK
所有标志都是必需的,以便解决在试图修复我的问题时出现的一些问题

allowTaskReparenting = true

可能已解决您的问题(使用此设置,当您返回转发应用程序时,您将返回该应用程序的“自然活动”,而不是它在目标应用程序中启动的活动)
不太清楚为什么true不是默认值…

也许可以尝试创建另一个活动,比如DeepLinkActivity,将其设置为处理深度链接,然后使用intent.setFlags(intent.FLAG\u activity\u REORDER\u to\u FRONT)@orelzion谢谢提示。它实际上让我找到了问题的答案!更多详细信息,请参见下面我的回答。我们有相同的问题,也使用了此标志。唯一的缺点是,如果在应用程序中打开了另一个活动,该活动将保留在历史记录中(位于新打开/重新排序的活动下方)。我们无法使用CLEAR_TASK(清除任务)| NEW_TASK(新建任务),因为它会影响应用程序是否显示在最近的内容中。所以我们决定,我们可以生活在历史上的另一个活动中,因为这种情况对我们来说非常罕见。很好的结合。我也在寻找同样的解决方案。谢谢