我正在开发一个android应用程序,它有两种启动方法。
一种是按手机上的应用程序图标。
另一种方法是从一个网站的深层链接。
deeplink还发送一些数据,应用程序需要做一些“事情”。不过,这应该只做一次。
当deeplink活动完成时,它将启动主活动。但是,当我按下后退键(在设备上)并从“最近”打开应用程序时,它会再次打开“深度链接”活动。
我可以将deeplink活动从清单中的最近者中排除。这也将mainActivity从最近的应用程序中排除,但事实并非如此。
如何防止从最近的应用程序开始的deeplink活动?
我的清单:

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

要切换到主活动,请执行以下操作:
        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()的信息
如果你仍然觉得这是一个副本,请解释。

最佳答案

你的问题是DeepLinkActivityMainActivity都在同一个任务中,所以当用户从最近的任务列表中选择应用程序时,android将把一个现有的任务放到前台,或者如果没有现有的任务(其中有活动/活动),启动他最近的任务。您无法预测哪个Activity将是根Activity,因为任务可以用ActivityActivity启动,这取决于用户首先选择的是哪个。
你真的需要有两个独立的任务来做这件事。一个任务将包含您的DeepLinkActivity,此任务应从“最近的任务列表”中排除。另一个任务将包含您的MainActivity
我假设DeepLinkActivity具有action=main和category=launcher的MainActivity,即使您发布的清单没有显示这一点。
您的清单应该如下所示:

<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来表示<intent-filter>,你也可能不需要它来表示launchMode="singleTask"(这取决于你对这个做了什么)。
指定MainActivity可确保DeepLinkActivity不会启动到与taskAffinity=""相同的任务中,并允许您在单独的任务中从DeepLinkActivity启动MainActivity。注意:如果不指定MainActivity,两个活动将在同一个任务中结束,即使您为它们都指定了DeepLinkActivity
taskAffinity上指定launchMode="singleTask"将告诉android以excludeFromRecents="true"为根活动的任务不应出现在最近的任务列表中。
DeepLinkActivity启动DeepLinkActivity时,应执行以下操作:
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

并确保在MainActivity上调用DeepLinkActivity
如有必要,您也可以将finish()添加到DeepLinkActivity,但我认为没有必要。如果用户在noHistory="true"中并收到来电,则在电话结束后,应显示DeepLinkActivity。如果指定DeepLinkActivity,则当用户接受来电时,DeepLinkActivity将立即完成。
如果这是清楚的,让我知道你的工作。

08-25 22:47