【问题标题】:Android activity launch mode and deeplink issueAndroid Activity 启动模式和深度链接问题
【发布时间】:2016-06-17 01:23:54
【问题描述】:

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

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

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

这当然可以通过将启动模式设置为 singleTop 来轻松解决,但随后会发生不同的问题! DeepLink 麻烦!

如果我的应用程序在后台打开,并且我在 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" />

【问题讨论】:

  • 也许尝试创建另一个活动,例如 DeepLinkActivity,将其设置为处理深层链接,然后使用 intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) 从那里触发正确的活动
  • @orelzion 感谢您的提示。它实际上使我找到了问题的答案!有关详细信息,请参阅下面的答案

标签: android deep-linking launchmode


【解决方案1】:

感谢 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,因为它影响应用程序是否显示在最近。所以我们决定,我们可以接受历史上的另一项活动,因为这种情况对我们来说非常罕见。
  • 不错的组合。
  • 我也在寻找相同的解决方案。谢谢!
【解决方案2】:
allowTaskReparenting = true

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

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

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,但在我的应用程序上,我不想返回登录活动,因为由于业务规则,会话必须保持活动状态。所以我决定创建一个新的 AppLinkActivity 来启动 MainActivity。 但 MainActivity 在 Manifest 上设置为 launchMode=singleInstance,并以以下标志开始:

    Intent intent = new Intent(AppLinkActivity.this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-18
      • 2016-07-29
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      相关资源
      最近更新 更多