V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nnegier
V2EX  ›  Android

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

  •  
  •   nnegier · 2023-09-01 09:09:15 +08:00 · 7899 次点击
    这是一个创建于 450 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2023-09-01 10:21:16 +08:00
    #1 1 楼可行
    9 条回复    2023-09-01 15:13:17 +08:00
    hackerwgf
        1
    hackerwgf  
       2023-09-01 09:22:44 +08:00   ❤️ 1
    可以这样试试,通知拉起的情况下在 intent 中加入特殊 extra ,Activity 启动时判断,有就正常逻辑,没有就 finish 掉自己去启动 MainActivity
    zhanlanhuizhang
        2
    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
        3
    nnegier  
    OP
       2023-09-01 09:58:16 +08:00 via Android
    @zhanlanhuizhang 不搭噶的哈
    lisongeee
        4
    lisongeee  
       2023-09-01 10:12:51 +08:00
    从 从前台通知中启动了一个 Activity ,如果这个 Activity 不是 MainActivity ,又不想在[系统最近任务界面]显示这个快照

    你可以重写 finish() 换成 finishAndRemoveTask() 这样你 finish 这个界面的时候,它不会在 [系统最近任务界面] 上显示
    nnegier
        5
    nnegier  
    OP
       2023-09-01 10:22:07 +08:00
    @lisongeee 试过,如问题所述,这样会造成用户的不方便,用户就不能从最近任务栈中启动应用了
    unco020511
        6
    unco020511  
       2023-09-01 10:37:01 +08:00
    有好多种做法,一种是全部都先跳转到 MainActivity,再根据参数进入对应的业务 Activity,你返回后会回到 Mainactivity,自然就不存在你说的问题了,
    另外一种是,你在业务 Activity 中 finish 时,手动打开 MainActivity 并清掉之前 task.
    xmai
        7
    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
        8
    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
        9
    daiisdai  
       2023-09-01 15:13:17 +08:00
    当我返回 finish 掉这个页面时,把这个任务从最近任务栈中移除, 启动 MainActivity 并且 finish 掉
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2759 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 06:31 · PVG 14:31 · LAX 22:31 · JFK 01:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.