【问题标题】:Android: Recents starts incorrect activityAndroid:最近开始的活动不正确
【发布时间】:2016-10-12 14:40:31
【问题描述】:

我正在开发一个具有 2 种启动方法的 android 应用程序。 一种是按手机上的应用程序图标的正常方式。 另一种方法是使用来自网站的深层链接。

深层链接还会发送一些数据,应用程序需要这些数据来做一些“事情”。然而,这应该只做一次。 深度链接活动完成后,它会启动主要活动。但是,当我按下(在设备上)并从最近打开应用程序时,它会再次打开深度链接活动。

我可以从清单中的最近更新中排除深层链接活动。这也从最近的应用程序中排除了 mainactivity,这不应该是这种情况。

如何防止深度链接活动从最近的应用程序开始?

我的清单:

   <activity
        android:name="MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:launchMode="singleTask"
        android:theme="@style/AppTheme">
    </activity>

    <activity
        android:name="DeeplinkActivity"
        android:label="@string/app_name"
        android:noHistory="true"
        android:screenOrientation="portrait"
        android:launchMode="singleTask"
        android:theme="@style/AppTheme">

        <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:scheme="app_name" android:host="test" />
        </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="test" android:path="/" android:scheme="app_name" />
        </intent-filter>
    </activity>

要切换到 MainActivity,我执行以下操作:

        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);

编辑: 这篇文章被标记为重复:Android: Starting app from 'recent applications' starts it with the last set of extras used in an intent

但是,该帖子涉及相同的活动。我想更改根活动,因此当我从最近启动应用程序时,它不会启动 DeeplinkActivity。是的,作为一种解决方法,我可以检查 Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY 标志。但是,每次用户从最近启动应用程序时,DeeplinkActivity 都会打开,而不再需要它。

设置和/或清除其他意图值似乎不起作用。 我使用来自 getIntent().getData() 的信息

如果您仍然觉得这是重复的,请解释一下。

【问题讨论】:

  • 我重新打开了这个问题。

标签: android android-activity deeplink


【解决方案1】:

您的问题是DeepLinkActivityMainActivity 都在同一个任务中,所以当用户从最近任务列表中选择应用程序时,Android 要么将现有任务带到前台,要么如果有没有现有任务(其中包含实时/活动活动),启动 Activity,它是最近任务中的根 Activity。您无法预测哪个Activity 将成为根Activity,因为该任务可以使用DeepLinkActivityMainActivity 启动,这取决于用户首先选择了哪一个。

您确实需要有 2 个单独的任务来执行此操作。一项任务将包含您的DeepLinkActivity,并且该任务应从“最近的任务列表”中排除。另一个任务将包含您的MainActivity

我假设 MainActivity 具有 ACTION=MAIN 和 CATEGORY=LAUNCHER 的 &lt;intent-filter&gt;,即使您发布的清单没有显示这一点。

您的清单应如下所示:

<activity
    android:name="MainActivity"
    android:label="@string/app_name"
    android:screenOrientation="portrait"
    android:theme="@style/AppTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name="DeeplinkActivity"
    android:label="@string/app_name"
    android:noHistory="true"
    android:screenOrientation="portrait"
    android:taskAffinity=""
    android:excludeFromRecents="true"
    android:theme="@style/AppTheme">

    <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:scheme="app_name" android:host="test" />
    </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="test" android:path="/" android:scheme="app_name" />
    </intent-filter>
</activity>

对于MainActivity,您绝对不需要launchMode="singleTask",对于DeepLinkActivity,您可能也不需要它(这取决于您还用它做什么)。

指定taskAffinity="" 可确保DeepLinkActivity 不会启动到与MainActivity 相同的任务中,并允许您在单独的任务中从DeepLinkActivity 启动MainActivity。注意:如果不指定 taskAffinity,即使您为它们都指定了 launchMode="singleTask",这两个活动也将在同一个任务中结束。

DeepLinkActivity 上指定excludeFromRecents="true" 告诉Android 以DeepLinkActivity 作为其根活动的任务不应出现在最近的任务列表中。

当您从DeepLinkActivity 启动MainActivity 时,您应该这样做:

    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

并确保您在DeepLinkActivity 上致电finish()

如果需要你也可以加noHistory="true"DeepLinkActivity,不过我觉得没必要。如果用户在DeepLinkActivity,有来电,通话结束后,应显示DeepLinkActivity。如果您指定noHistory="true",则DeepLinkActivity 将在用户接听来电时立即结束。

让我知道这是否清楚并且对您有用。

【讨论】:

  • 感谢您的遮阳篷。确实这是解决我的问题的方法。作为一个小旁注。
  • 对我来说需要使用 noHistory。因为在你的例子中有一个电话。当用户返回应用程序时,该进程需要重新启动。
  • 如果我从通知中打开一个活动,比如说,A,然后在完成 A 后转到 B。然后按返回,我打开 MainActivity。如果我按回应用程序关闭,那么如果我从最近打开应用程序。它打开相同的 A 活动,然后转到 B。我希望它打开启动器活动,就像单击会一样。
  • @AmanVerma 你应该为这个问题打开一个新问题。在回答另一个问题时发表评论并不是正确关注您的问题的方法。同时,看看我对这个问题的回答可能会有所帮助:stackoverflow.com/a/19820057/769265
  • 昨天已经在这里问过问题了...请查看stackoverflow.com/questions/61965236/…
猜你喜欢
  • 2015-06-04
  • 2013-03-13
  • 2013-06-19
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多