我正在开发一个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()的信息
如果你仍然觉得这是一个副本,请解释。
最佳答案
你的问题是DeepLinkActivity
和MainActivity
都在同一个任务中,所以当用户从最近的任务列表中选择应用程序时,android将把一个现有的任务放到前台,或者如果没有现有的任务(其中有活动/活动),启动他最近的任务。您无法预测哪个Activity
将是根Activity
,因为任务可以用Activity
或Activity
启动,这取决于用户首先选择的是哪个。
你真的需要有两个独立的任务来做这件事。一个任务将包含您的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
将立即完成。如果这是清楚的,让我知道你的工作。