Android activity 启动模式和深层链接问题
Android activity launch mode and deeplink issue
我的应用程序有 2 个活动。
应用程序的根 activity 是 MainActivity。如果凭据丢失或无效,用户将在完成 MainActivity 时被重定向到 LoginActivity。
如果我将主 activity 的启动模式设置为 singleTask 并且我在 LoginActivity 的内部片段中 => 最小化应用程序 -> 从启动器图标启动应用程序 => MainActivity 启动(因为它是一个 singleTask activity)并重定向到 LoginActivity 但当然会重定向到堆栈中的第一个片段。
想要的行为(就像从最近重新启动时发生的那样)是它会保留当前 activity 的实例并在 LoginActivity 的堆栈中显示正确的片段。
这当然可以通过将启动模式设置为 singleTop 轻松解决,但随后会发生另一个问题! DeepLink 麻烦!
如果我的应用程序在后台打开并且我在 singleTop 模式下从浏览器或电子邮件中单击 link - 该应用程序将作为转发应用程序的子任务打开(如果您单击最近您会看到您的应用程序打开了两次 - 一次作为之前存在的常规实例,一次包含在 browser/email 中)。
这当然非常不方便,可以通过 - 你知道的 - 将启动模式设置为 singleTask 来解决!
我们将不胜感激对此问题的任何帮助。
<!-- Main Activity -->
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</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="somehost"
android:scheme="myscheme" />
</intent-filter>
</activity>
<!-- Login Activity -->
<activity
android:name="LoginActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait" />
感谢 orelzion 的提示,我设法解决了这个问题:
我确实创建了一个新的 DeepLinkActivity,它启动了 MainActivity(我将启动模式从 "singleTask" 更改为 "singleTop"),带有以下标志:
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK
为了处理在尝试解决我的问题时出现的一些问题,需要所有标志。
allowTaskReparenting = true
https://developer.android.com/guide/topics/manifest/activity-element#reparent
可能已经解决了您的问题(使用此设置,当您 return 转到转发应用程序时,您将 return 转到该应用程序的 activity 自然,而不是activity 它在目标应用程序中启动)
不太清楚为什么 true 不是默认值...
我遇到了完全相同的问题,但在我的应用程序中,我从不想return登录Activity,因为根据业务规则,会话必须保持活动状态。所以我决定创建一个新的 AppLinkActivity 来启动 MainActivity。
但是 MainActivity 在 Manifest 上设置了 launchMode=singleInstance
,并以下列标志开始:
Intent intent = new Intent(AppLinkActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP);
我的应用程序有 2 个活动。 应用程序的根 activity 是 MainActivity。如果凭据丢失或无效,用户将在完成 MainActivity 时被重定向到 LoginActivity。
如果我将主 activity 的启动模式设置为 singleTask 并且我在 LoginActivity 的内部片段中 => 最小化应用程序 -> 从启动器图标启动应用程序 => MainActivity 启动(因为它是一个 singleTask activity)并重定向到 LoginActivity 但当然会重定向到堆栈中的第一个片段。
想要的行为(就像从最近重新启动时发生的那样)是它会保留当前 activity 的实例并在 LoginActivity 的堆栈中显示正确的片段。
这当然可以通过将启动模式设置为 singleTop 轻松解决,但随后会发生另一个问题! DeepLink 麻烦!
如果我的应用程序在后台打开并且我在 singleTop 模式下从浏览器或电子邮件中单击 link - 该应用程序将作为转发应用程序的子任务打开(如果您单击最近您会看到您的应用程序打开了两次 - 一次作为之前存在的常规实例,一次包含在 browser/email 中)。 这当然非常不方便,可以通过 - 你知道的 - 将启动模式设置为 singleTask 来解决!
我们将不胜感激对此问题的任何帮助。
<!-- Main Activity -->
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</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="somehost"
android:scheme="myscheme" />
</intent-filter>
</activity>
<!-- Login Activity -->
<activity
android:name="LoginActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait" />
感谢 orelzion 的提示,我设法解决了这个问题:
我确实创建了一个新的 DeepLinkActivity,它启动了 MainActivity(我将启动模式从 "singleTask" 更改为 "singleTop"),带有以下标志:
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK
为了处理在尝试解决我的问题时出现的一些问题,需要所有标志。
allowTaskReparenting = true
https://developer.android.com/guide/topics/manifest/activity-element#reparent
可能已经解决了您的问题(使用此设置,当您 return 转到转发应用程序时,您将 return 转到该应用程序的 activity 自然,而不是activity 它在目标应用程序中启动) 不太清楚为什么 true 不是默认值...
我遇到了完全相同的问题,但在我的应用程序中,我从不想return登录Activity,因为根据业务规则,会话必须保持活动状态。所以我决定创建一个新的 AppLinkActivity 来启动 MainActivity。
但是 MainActivity 在 Manifest 上设置了 launchMode=singleInstance
,并以下列标志开始:
Intent intent = new Intent(AppLinkActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP);