Android活动启动模式和深层链接问题

时间:2016-03-03 15:55:18

标签: android deep-linking launchmode

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

如果我将主要活动的启动模式设置为singleTask,并且我位于LoginActivity =>的内部片段中最小化应用程序 - >从启动器图标=>启动应用程序MainActivity启动(因为它是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" />

2 个答案:

答案 0 :(得分:10)

非常感谢orelzion提示我设法解决了这个问题:

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

Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK

需要所有标记才能解决在尝试修复问题时出现的一些问题。

答案 1 :(得分:0)

allowTaskReparenting = true

https://developer.android.com/guide/topics/manifest/activity-element#reparent

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