gpt4 book ai didi

android - Intent.FLAG_ACTIVITY_CLEAR_TASK 和 Intent.FLAG_ACTIVITY_TASK_ON_HOME 的区别

转载 作者:行者123 更新时间:2023-12-02 07:40:05 26 4
gpt4 key购买 nike

从 Android 文档:

FLAG_ACTIVITY_CLEAR_TASK

If set in an Intent passed to Context.startActivity(), this flag will cause any existing task that would be associated with the activity to be cleared before the activity is started. That is, the activity becomes the new root of an otherwise empty task, and any old activities are finished. This can only be used in conjunction with FLAG_ACTIVITY_NEW_TASK.





FLAG_ACTIVITY_TASK_ON_HOME

If set in an Intent passed to Context.startActivity(), this flag will cause a newly launching task to be placed on top of the current home activity task (if there is one). That is, pressing back from the task will always return the user to home even if that was not the last activity they saw. This can only be used in conjunction with FLAG_ACTIVITY_NEW_TASK.



考虑这两个 fragment :
Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);


Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
startActivity(intent);

根据我的理解,在任一代码 fragment 中,我们都创建了一个只有 Activity 的新任务,当您按下返回键时,您将转到主屏幕。假设我可能弄错了,两者之间有什么区别?另外,如果我有另一个带有 Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME | Intent.FLAG_ACTIVITY_CLEAR_TASK 的 fragment 那会怎样?

最佳答案

2个 fragment 之间存在差异。以下是一些重要的背景信息:

  • 一个任务包含一堆 Activity 。任务可以在前台或后台。
  • 任务也是“堆叠”的。如果您在任务 A 中并开始一个新任务 B ,则任务 B 将堆叠在任务 A 之上。如果用户在任务 B 中按下 BACK 键足够多的次数,他最终将返回任务`A。这是标准的 Android 行为。

  • 你的 fragment ...
    Intent intent = new Intent(this, Activity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(intent);

    ...将做以下事情之一,具体取决于...
  • 如果 Activity 与当前任务具有相同的任务关联(即:执行此代码的任务),它将清除当前任务(完成任务中的所有 Activity )并将 Activity 的新实例启动到当前任务中.如果用户按下 BACK 键,这将完成 Activity 并完成当前任务(因为任务中只有 1 个 Activity )并将用户返回到主页屏幕或启动此任务的任务(正在执行的任务)在任务堆栈中的此任务下方)。
  • 如果 Activity 具有与当前任务不同的任务关联,并且已经存在具有该任务关联的现有任务(即:Activity 所属的现有任务),则该现有任务被置于前台,清除(所有任务中的 Activity 完成),在任务的根创建一个新的 Activity 实例,并将这个任务放在当前任务的顶部(这样当 Activity 完成时,用户会被放回到当前任务中)。
  • 如果 Activity 与当前任务具有不同的任务关联,并且没有具有该任务关联的现有任务,则创建一个新任务,并在任务的根创建 Activity 的新实例,并将该任务放在最上面当前任务的(这样当 Activity 完成时,用户会回到当前任务中)。


  • 这段代码 fragment ...
    Intent intent = new Intent(this, Activity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
    startActivity(intent);

    ...将做以下事情之一取决于...
  • 如果 Activity 与当前任务具有相同的任务关联(即:执行此代码的任务)并且 Activity 是当前任务的根 Activity ,则不会执行任何操作。它不会启动新任务,不会清除任何 Activity ,不会创建 Activity 的新实例,也不会更改当前任务完成时发生的行为(即:如果当前任务已启动)通过另一个任务,当当前任务中的所有 Activity 都完成时,它会将用户放回到任务堆栈中的前一个任务中)。
  • 如果 Activity 与当前任务具有相同的任务关联(即:执行此代码的任务)并且 Activity 而不是 当前任务的根 Activity ,这将简单地创建一个新的 Activity 实例并将其放入在当前任务的当前 Activity 之上。它不会启动新任务,不会清除任何 Activity ,也不会改变当前任务完成时发生的行为(即:如果当前任务是由另一个任务启动的,当当前任务中的所有 Activity 任务完成后,它会将用户放回到任务堆栈中的前一个任务中)。
  • 如果 Activity 具有与当前任务不同的任务关联,并且已经存在具有该任务关联的现有任务(即:Activity 所属的现有任务)并且 Activity 是该现有任务的根 Activity ,则该现有任务任务被带到前台,并且该任务与任务堆栈分离(即:当该任务中的所有 Activity 完成时,它会将用户返回到主屏幕, 而不是 到启动该任务的任务)。
  • 如果 Activity 与当前任务具有不同的任务关联,并且已经存在具有该任务关联的现有任务(即:Activity 所属的现有任务)并且 Activity 而不是 现有任务的根 Activity 然后该现有任务被带到前台,并且该任务与任务堆栈分离(即:当该任务中的所有 Activity 都完成时,它将用户返回到主页屏幕和 而不是 到启动该任务的任务) 并创建一个新的 Activity 实例并将其置于该任务中的任何现有 Activity 之上。
  • 如果 Activity 与当前任务具有不同的任务关联,并且没有具有该任务关联的现有任务,则创建一个新任务并在任务的根创建 Activity 的新实例,并将新任务从任务堆栈(以便当 Activity 完成时,用户返回到主屏幕, 而不是 到启动它的任务)。


  • 最后,这个 fragment ...
    Intent intent = new Intent(this, Activity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
    startActivity(intent);

    ...将做以下事情之一,具体取决于...
  • 如果 Activity 与当前任务具有相同的任务关联(即:执行此代码的任务),它将清除当前任务(完成任务中的所有 Activity )并将 Activity 的新实例启动到当前任务中.如果用户按下 BACK 键,这将完成 Activity 并完成当前任务(因为任务中只有 1 个 Activity )并将用户返回到主页屏幕。
  • 如果 Activity 具有与当前任务不同的任务关联,并且已经存在具有该任务关联的现有任务(即:Activity 所属的现有任务),则该现有任务被置于前台,清除(所有任务中的 Activity 完成),在任务的根创建一个新的 Activity 实例,并且这个任务从任务堆栈中解耦(这样当 Activity 完成时,用户返回到主屏幕)。
  • 如果 Activity 与当前任务具有不同的任务关联,并且没有具有该任务关联的现有任务,则创建一个新任务,并在任务的根创建 Activity 的新实例,并将该任务与任务解耦任务堆栈(以便当 Activity 完成时,用户返回到主屏幕)。


  • 我意识到这个答案很长很复杂,但有很多不同的情况。我可能还没有涵盖所有可能的情况(例如,如果 Activity 具有特殊的启动模式)...

    关于android - Intent.FLAG_ACTIVITY_CLEAR_TASK 和 Intent.FLAG_ACTIVITY_TASK_ON_HOME 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21833402/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com