请教 Android 任务栈 Intent 指向相关问题?

2023-09-01 09:09:15 +08:00
 nnegier

应用关闭后,我点击通知启动(即从前台通知中启动)了一个 Activity 的界面。当我返回 finish 掉这个页面后。再点击 menu 点击任务栈中那个应用,点进去还是那个 Activity 。

所以我想询问,我能在关闭的时候修改掉那个任务栈的指向为 MainActivity 吗?我尝试过修改 Intent#setClass 想更改指向,但这个貌似是存在手机系统里的,我修改不掉。如果我清除掉这个任务栈又给用户不方便,因为它无法从 menu 任务栈中进入应用了。我也不能在用户点击通知的时候给它添加 parentTask ,因为这样用户返回就不能直接回到手机桌面而是进入应用了。所以我要是能修改 menu 任务栈中点击的时候 intent 的指向为 MainActivity ,这就完美解决了我的问题,可是应该怎么做呢?

7875 次点击
所在节点    Android
9 条回复
hackerwgf
2023-09-01 09:22:44 +08:00
可以这样试试,通知拉起的情况下在 intent 中加入特殊 extra ,Activity 启动时判断,有就正常逻辑,没有就 finish 掉自己去启动 MainActivity
zhanlanhuizhang
2023-09-01 09:37:44 +08:00
基础问题,Activity 的启动模式:android:launchMode=["standard" | "singleTop" |
"singleTask" | "singleInstance" | "singleInstancePerTask"] https://developer.android.com/guide/topics/manifest/activity-element?hl=zh-cn
nnegier
2023-09-01 09:58:16 +08:00
@zhanlanhuizhang 不搭噶的哈
lisongeee
2023-09-01 10:12:51 +08:00
从 从前台通知中启动了一个 Activity ,如果这个 Activity 不是 MainActivity ,又不想在[系统最近任务界面]显示这个快照

你可以重写 finish() 换成 finishAndRemoveTask() 这样你 finish 这个界面的时候,它不会在 [系统最近任务界面] 上显示
nnegier
2023-09-01 10:22:07 +08:00
@lisongeee 试过,如问题所述,这样会造成用户的不方便,用户就不能从最近任务栈中启动应用了
unco020511
2023-09-01 10:37:01 +08:00
有好多种做法,一种是全部都先跳转到 MainActivity,再根据参数进入对应的业务 Activity,你返回后会回到 Mainactivity,自然就不存在你说的问题了,
另外一种是,你在业务 Activity 中 finish 时,手动打开 MainActivity 并清掉之前 task.
xmai
2023-09-01 10:50:21 +08:00
1. 在关闭 Activity 之前,调用 moveTaskToBack(true) 方法将应用移到后台。这将使应用隐藏在任务栈中,而不是完全关闭。

2. 在通知的点击事件中,创建一个新的 Intent ,并设置其标志为 FLAG_ACTIVITY_CLEAR_TOP 和 FLAG_ACTIVITY_SINGLE_TOP 。然后将目标 Activity 设置为 MainActivity ,并将该 Intent 发送给系统。

```
Intent intent = new Intent(context, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(intent);
```
taikoli
2023-09-01 11:43:14 +08:00
Part 1:

1. 确保你在通知启动的 Activity 中正确设置了导航栈的 Affinity (亲和性)和 Task (任务)属性。通常情况下 MainActivity 是设置一个独立的 Affinity 值,并为启动的 Activity 设置与 MainActivity 相同的 Affinity 值,以确保它们在同一个任务栈中。

2. 在需要关闭的 Activity 中通过设置 `android:noHistory="true"` 属性来忽略该页面的历史记录。这样,在关闭该页面时,它将不会保留在任务栈中。

3. 在通知启动的 Activity 中,根据需要在 `onCreate()` 方法中添加逻辑,判断用户是从通知启动还是从任务栈菜单启动。如果是从通知启动,您可以执行 `finish()` 来关闭通知启动的 Activity ,并通过 `startActivity()` 启动 MainActivity 。这样,在用户返回任务栈菜单时,它将重新启动 MainActivity 。

Part 2:

如果您已经尝试了上述步骤但仍然无法在任务栈菜单中将指向修改为 MainActivity ,您可以考虑以下几种解决方案:

1. 使用如 SingleTask 或 SingleInstance 的启动模式:在 MainActivity 的声明中,设置启动模式为 SingleTask 或 SingleInstance 。这样一来,当用户从任务栈菜单中点击应用时,将会创建一个新的任务栈并启动 MainActivity 。

2. 使用 FLAG_ACTIVITY_CLEAR_TOP 标志:在启动 MainActivity 的 Intent 中添加 FLAG_ACTIVITY_CLEAR_TOP 标志,它将清除所有在其上面的 Activity ,并将目标 Activity 定位在任务栈的顶部。这样一来,当用户从任务栈菜单中点击应用时,将会清除之前的 Activity 并重新打开 MainActivity 。

3. 使用 FLAG_ACTIVITY_NEW_TASK 标志:在启动 MainActivity 的 Intent 中添加 FLAG_ACTIVITY_NEW_TASK 标志,它将创建一个新的任务栈并启动目标 Activity 。这样一来,无论用户是从通知启动还是从任务栈菜单启动应用,都将在新的任务栈中启动 MainActivity 。
daiisdai
2023-09-01 15:13:17 +08:00
当我返回 finish 掉这个页面时,把这个任务从最近任务栈中移除, 启动 MainActivity 并且 finish 掉

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/969952

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX