6

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

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

我可以从清单中的最近更新中排除深度链接活动。这也从最近的应用程序中排除了主要活动,情况不应该如此。

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

我的清单:

   <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:从“最近的应用程序”启动应用程序以意图中使用的最后一组附加功能启动它

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

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

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

4

1 回答 1

5

您的问题是两者DeepLinkActivityMainActivity在同一个任务中,因此当用户从最近的任务列表中选择应用程序时,Android 会将现有任务置于前台,或者如果没有现有任务(具有实时/活动活动在其中),启动最近任务中Activity的根目录。Activity您无法预测哪个Activity会是 root Activity,因为任务可以使用DeepLinkActivity或开始MainActivity,这取决于用户首先选择了哪个。

你真的需要有 2 个单独的任务才能做到这一点。一项任务将包含您DeepLinkActivity,并且该任务应从“最近的任务列表”中排除。另一个任务将包含您MainActivity的内容。

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

您的清单应如下所示:

<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>

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

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

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

当你从 启动MainActivityDeepLinkActivity,你应该这样做:

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

并确保您调用finish().DeepLinkActivity

如有必要,您也可以添加noHistory="true"DeepLinkActivity,但我认为没有必要。如果用户正在DeepLinkActivity通话并接到来电,则在通话结束后,DeepLinkActivity应显示。如果您指定noHistory="true",DeepLinkActivity将在用户接听来电时立即完成。

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

于 2016-10-12T20:20:56.217 回答