Android 深度链接。从历史记录打开应用程序时,意图不会重置

Posted

技术标签:

【中文标题】Android 深度链接。从历史记录打开应用程序时,意图不会重置【英文标题】:Android deep-linking. Intent doesn't reset when app is opened from history 【发布时间】:2014-08-08 16:33:43 【问题描述】:

我对 android 任务和意图管理有疑问。

场景

    用户通过应用程序的深层链接获得推送。 我们显示一个将 URI 放入 Intent 数据的通知。 用户单击通知并进入应用程序并重定向到深层链接描述的某个 Feature1Activity。 用户环顾四周,然后退出应用程序。 稍后,用户从历史记录中打开应用(长按主页或多任务按钮)。 现在使用通知中使用的相同意图(在意图数据中具有深层链接)用于启动应用程序。 因此,用户再次进入 Feature1Activity。

问题:

从历史记录启动应用(长按主页或多任务按钮)不会重置任务(从应用图标启动时会重置)。

我了解从历史记录启动应用程序不应重置任务,因为它旨在用作“获得正确的位置”。但是,就我而言,这是一个问题,因为从通知中启动应用程序是一次性的。

还有其他人遇到过这个问题吗?有谁知道解决办法吗?

更深入

PendingIntent 内部的意图是这样构建的:

Intent intent = new Intent (Intent.ActionView);
intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
intent.setData (Uri.Parse (DEEP_LINK_URL));

我就在今天发现了 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 并且真的认为它可以解决我的问题,但它没有任何区别。

有三个感兴趣的活动:

SplashActivity       (main launcher & listener of the deep-linking schema -- this activity just redirects either to login or OverviewActivity)
OverviewActivity     (authorized user's main activity)
Feature1Activity     (any feature that the deep-link is pointing to)

当用户点击通知时,SplashActivity 充当架构的侦听器,并将深层链接 url 转换为两个意图,以使用 Activity.startActivities (Intent[]) 启动 OverviewActivity 和 Feature1Activity。

当我从 SplashActivity 内的通知中查看意图时,它始终包含数据中的深层链接。

一种解决方法

有一种解决方法,将一些 booleanExtra 字段设置为通知意图(例如“ignoreWhenLaunchedFromHistory”=true),然后在重定向之前检查 SplashActivity

boolean fromHistory = (getIntent().getFlags() & FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY;

if (fromHistory && getIntent().getBooleanExtra ("ignoreWhenLaunchedFromHistory", false))
    // Don't follow deep-link even if it exists
else
    // Follow deep-link

除了丑陋和丑陋之外,你能看出这个解决方法有什么问题吗?

编辑:只有当我负责发送带有深层链接的 Intent 时,解决方法才有效。因为没有外部来源可以知道“ignoreWhenLaunchedFromHistory”这个额外的信息。

【问题讨论】:

我也有这个问题,我正在使用与您相同的修复程序。您找到其他解决方案了吗? 这里也一样。我希望 android 团队提供一种简单的方法来解决这个问题。处理多个深层链接时会变得非常困难。 【参考方案1】:

据我所知,也许在清单上使用android:excludeFromRecents="true"(作为 Activity 声明的属性)可能会改善问题?

【讨论】:

以上是关于Android 深度链接。从历史记录打开应用程序时,意图不会重置的主要内容,如果未能解决你的问题,请参考以下文章

延迟深度链接到 android 上的外部应用程序

jQuery地址从历史记录中删除最后一个网址

来自深度链接意图时如何仅打开 1 个 android 应用程序实例?

Android 8.0+ 深度链接仅在应用程序被杀死时才首先打开启动器活动

从后台打开 React Native 深层链接应用程序

应用在后台运行时,本机深度链接