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

9
我的应用程序有两个活动。 应用的根活动是MainActivity。如果凭据缺失或无效,则用户将在完成MainActivity时重定向到LoginActivity。
如果将主活动的启动模式设置为singleTask,并且我在LoginActivity的内部片段中=>最小化应用程序=>从启动器图标启动应用程序=>MainActivity启动(因为它是singleTask活动)并重定向到LoginActivity,但当然是堆栈中的第一个片段。
所需的行为(在从最近重新启动时发生的情况)是保留当前活动的实例并在LoginActivity的堆栈中显示正确的片段。
这当然可以通过将启动模式设置为singleTop来轻松解决,但随之而来的是不同的问题!深度链接麻烦!
如果我的应用程序在后台打开,并且我在singleTop模式下从浏览器或电子邮件中单击链接-应用程序将作为转发应用程序的子任务打开(如果单击最近,则会看到应用程序打开两次-一次作为先前存在的常规实例,以及一次包含在浏览器/电子邮件中)。 当然,这非常不方便,可以通过-你知道的-将启动模式设置为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" />

1
也许尝试创建另一个活动,比如DeepLinkActivity,将其设置为处理深度链接,然后使用intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)从那里启动正确的活动。 - orelzion
@orelzion 谢谢你的提示。它实际上帮助我找到了解决问题的答案!请查看下面的答案以获取更多详细信息。 - GuyZ
3个回答

15

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

我创建了一个新的DeepLinkActivity,并使用以下标记启动MainActivity(我将其从“singleTask”更改为“singleTop”):

Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK

为了解决我的问题,需要使用所有标志来处理一些问题。


我们也遇到了同样的问题,并使用了这个标记。唯一的缺点是,如果在应用程序中打开另一个活动,则此活动将保留在历史记录中(在新打开/重新排序的活动下面)。我们无法使用CLEAR_TASK | NEW_TASK,因为它会影响应用程序是否显示在最近列表中。因此,我们决定可以接受历史记录中的另一个活动,因为这种情况对我们来说非常罕见。 - marwinXXII
不错的组合。 - sunlover3
我也在寻找相同的解决方案。谢谢! - Vaishali Sharma

0
我遇到了相似的问题,但是在我的应用程序中,我永远不想返回到登录活动,因为会话必须保持活动状态以符合业务规则。所以我决定创建一个新的AppLinkActivity来启动MainActivity。 但是MainActivity在清单文件中设置为launchMode=singleInstance,并使用以下标志启动:
Intent intent = new Intent(AppLinkActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP);

如果同时指定了{@link #FLAG_ACTIVITY_CLEAR_TOP},则此标志FLAG_ACTIVITY_REORDER_TO_FRONT将被忽略。https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/content/Intent.java;l=6662;drc=a89fede08c7c98bae3c82edc3eefbc9bae6e1de3 - Ben.Slama.Jihed

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接