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

时间:2016-10-12 14:40:31

标签: android android-activity deeplink

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

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

我可以从清单中的最新版本中排除深层链接活动。这也排除了最近应用程序的主要活动,但情况并非如此。

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

我的宣言:

   <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就会被打开,而不再需要它。

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

的信息

如果您仍然认为这是重复,请解释。

1 个答案:

答案 0 :(得分:4)

您的问题是DeepLinkActivityMainActivity都在同一个任务中,因此当用户从最近任务列表中选择应用时,Android会将现有任务带到前台,或者如果没有现有任务(其中包含实时/活动活动),请启动最近任务中作为根Activity的{​​{1}}。您无法预测哪个Activity将成为根Activity,因为任务可以使用ActivityDeepLinkActivity启动,具体取决于用户首先选择的任务。

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

我认为MainActivity的{​​{1}}包含ACTION = MAIN和CATEGORY = LAUNCHER,即使您发布的清单没有显示此内容。

你的清单应该是这样的:

MainActivity

<intent-filter>你绝对不需要<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 。注意:如果未指定MainActivity,则两个活动最终都会在同一任务中完成,即使您为这两个活动指定了DeepLinkActivity

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

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

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

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

如果这一点很明确并且适合您,请告诉我。