Android:最近启动不佳 activity
Android: Recents starts incorrect activity
我正在开发一个 android 应用程序,它有两种启动方法。
一种是按 phone 上的应用程序图标的正常方法。
另一种方法是使用来自网站的深度 link。
deeplink 还会发送应用程序需要做的一些数据 "stuff"。但是,这应该只进行一次。
当 deeplink activity 完成后,它会启动 main activity。但是,当我(在设备上)按回键并从最近打开应用程序时,它会再次打开 deeplink activity。
我可以从清单中的最近更新中排除深度link activity。这也从最近的应用程序中排除了mainactivity,应该不是这样。
如何防止 deeplinkactivity 从最近的应用程序中启动?
我的清单:
<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);
编辑:
此 post 被标记为重复:Android: Starting app from 'recent applications' starts it with the last set of extras used in an intent
然而 post 是关于相同的 activity。我想更改根 activity,因此当我从最近启动应用程序时,它不会启动 DeeplinkActivity。是的,作为一种解决方法,我可以检查 Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY 标志。但是每次用户从最近启动应用程序时,DeeplinkActivity 都会打开,而不再需要它了。
设置和/或清除其他意图值似乎不起作用。
我使用来自 getIntent().getData()
的信息
如果您仍然觉得这是重复的,请解释。
你的问题是 DeepLinkActivity
和 MainActivity
都在同一个任务中,所以当用户从最近任务列表中选择应用程序时,Android 要么会带来一个现有任务到前台,或者如果没有现有任务(其中有 live/active 个活动),则在最近的任务中启动作为根 Activity
的 Activity
。您无法预测哪个 Activity
将成为根 Activity
,因为任务可以从 DeepLinkActivity
或 MainActivity
开始,具体取决于用户先选择哪个。
您确实需要有 2 个单独的任务来执行此操作。一项任务将包含您的 DeepLinkActivity
,并且该任务应从 "recent task list" 中排除。另一个任务将包含您的 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>
对于 MainActivity
你绝对不需要 launchMode="singleTask"
并且对于 DeepLinkActivity
你可能也不需要它(这取决于你用它做什么)。
指定 taskAffinity=""
可确保 DeepLinkActivity
不会启动到与 MainActivity
相同的任务中,并允许您从 DeepLinkActivity
启动 MainActivity
单独的任务。注意:如果不指定 taskAffinity
,这两个活动将在同一个任务中结束,即使您为这两个活动指定 launchMode="singleTask"
。
在 DeepLinkActivity
上指定 excludeFromRecents="true"
告诉 Android 以 DeepLinkActivity
作为其根的任务 activity 不应出现在最近的任务列表中。
当您从 DeepLinkActivity
启动 MainActivity
时,您应该这样做:
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
并确保在 DeepLinkActivity
上调用 finish()
。
如果有需要也可以在DeepLinkActivity
中加上noHistory="true"
,不过我觉得没必要。如果用户在 DeepLinkActivity
中并接到 phone 来电,在 phone 通话结束后,应显示 DeepLinkActivity
。如果您指定 noHistory="true"
,DeepLinkActivity
将在用户接受传入的 phone 呼叫时立即完成。
让我知道这是否清楚并且适合您。
我正在开发一个 android 应用程序,它有两种启动方法。 一种是按 phone 上的应用程序图标的正常方法。 另一种方法是使用来自网站的深度 link。
deeplink 还会发送应用程序需要做的一些数据 "stuff"。但是,这应该只进行一次。 当 deeplink activity 完成后,它会启动 main activity。但是,当我(在设备上)按回键并从最近打开应用程序时,它会再次打开 deeplink activity。
我可以从清单中的最近更新中排除深度link activity。这也从最近的应用程序中排除了mainactivity,应该不是这样。
如何防止 deeplinkactivity 从最近的应用程序中启动?
我的清单:
<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);
编辑: 此 post 被标记为重复:Android: Starting app from 'recent applications' starts it with the last set of extras used in an intent
然而 post 是关于相同的 activity。我想更改根 activity,因此当我从最近启动应用程序时,它不会启动 DeeplinkActivity。是的,作为一种解决方法,我可以检查 Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY 标志。但是每次用户从最近启动应用程序时,DeeplinkActivity 都会打开,而不再需要它了。
设置和/或清除其他意图值似乎不起作用。 我使用来自 getIntent().getData()
的信息如果您仍然觉得这是重复的,请解释。
你的问题是 DeepLinkActivity
和 MainActivity
都在同一个任务中,所以当用户从最近任务列表中选择应用程序时,Android 要么会带来一个现有任务到前台,或者如果没有现有任务(其中有 live/active 个活动),则在最近的任务中启动作为根 Activity
的 Activity
。您无法预测哪个 Activity
将成为根 Activity
,因为任务可以从 DeepLinkActivity
或 MainActivity
开始,具体取决于用户先选择哪个。
您确实需要有 2 个单独的任务来执行此操作。一项任务将包含您的 DeepLinkActivity
,并且该任务应从 "recent task list" 中排除。另一个任务将包含您的 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>
对于 MainActivity
你绝对不需要 launchMode="singleTask"
并且对于 DeepLinkActivity
你可能也不需要它(这取决于你用它做什么)。
指定 taskAffinity=""
可确保 DeepLinkActivity
不会启动到与 MainActivity
相同的任务中,并允许您从 DeepLinkActivity
启动 MainActivity
单独的任务。注意:如果不指定 taskAffinity
,这两个活动将在同一个任务中结束,即使您为这两个活动指定 launchMode="singleTask"
。
在 DeepLinkActivity
上指定 excludeFromRecents="true"
告诉 Android 以 DeepLinkActivity
作为其根的任务 activity 不应出现在最近的任务列表中。
当您从 DeepLinkActivity
启动 MainActivity
时,您应该这样做:
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
并确保在 DeepLinkActivity
上调用 finish()
。
如果有需要也可以在DeepLinkActivity
中加上noHistory="true"
,不过我觉得没必要。如果用户在 DeepLinkActivity
中并接到 phone 来电,在 phone 通话结束后,应显示 DeepLinkActivity
。如果您指定 noHistory="true"
,DeepLinkActivity
将在用户接受传入的 phone 呼叫时立即完成。
让我知道这是否清楚并且适合您。