Android:最近的活动开始不正确

rem*_*coj 5 android android-activity deeplink

我正在开发一个Android应用程序,它有2个启动方法.一种是通过按手机上的应用程序图标的正常方式.另一种方法是使用网站的深层链接.

深层链接还会发送应用程序需要做一些"东西"的一些数据.但是,这应该只进行一次.深度链接活动完成后,它将启动主要活动.但是当我按下(在设备上)并从最近打开应用程序时,它会再次打开深层链接活动.

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

如何防止从最近的应用程序启动深层链接活动?

我的清单:

   <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>
Run Code Online (Sandbox Code Playgroud)

要切换到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);
Run Code Online (Sandbox Code Playgroud)

编辑:这篇文章被标记为重复:Android:从'最近的应用程序'启动应用程序启动它与意图中使用的最后一组额外的

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

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

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

Dav*_*ser 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>
Run Code Online (Sandbox Code Playgroud)

你绝对不需要launchMode="singleTask"MainActivity,你可能不需要它的DeepLinkActivity是(这取决于你使用此做些什么)。

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

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

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

    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

并确保你打电话finish()DeepLinkActivity

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

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