Intent.FLAG_ACTIVITY_CLEAR_TASK与Intent.FLAG_ACTIVITY_TASK_ON_HOME之间的区别

时间:2014-02-17 15:47:13

标签: android android-intent

来自Android文档:

  

FLAG_ACTIVITY_CLEAR_TASK

     

如果在传递给Context.startActivity()的Intent中设置,则此标志将为   导致任何与活动相关联的现有任务   在活动开始前清除。也就是活动   成为一个空的任务的新根,和任何旧的任务   活动结束了。这只能与。一起使用   FLAG_ACTIVITY_NEW_TASK。

  

FLAG_ACTIVITY_TASK_ON_HOME

     

如果在传递给Context.startActivity()的Intent中设置,则此标志将为   导致新启动的任务被置于当前主页之上   活动任务(如果有)。也就是说,从任务中退回   即使不是最后一个,也总会将用户返回到家   他们看到的活动。这只能与。一起使用   FLAG_ACTIVITY_NEW_TASK。

考虑这两个片段:

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);

我理解的方式是,在任一代码片段中,我们创建一个新的任务,其中只有Activity,当你按下后,你会进入主屏幕。假设我可能弄错了,两者之间有什么区别?另外,如果我有另一个Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME | Intent.FLAG_ACTIVITY_CLEAR_TASK代码段会如何表现呢?

1 个答案:

答案 0 :(得分:102)

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

  • 任务包含一堆活动。任务可以在前台或后台。

  • 任务也是"堆积"。如果您处于任务A并开始新任务B,则任务B会叠加在任务A之上。如果用户在任务B中按下BACK键足够多次,他最终将返回任务“A”。这是标准的Android行为。

你的片段......

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

...将执行以下任务之一,具体取决于......

  1. 如果Activity与当前任务具有相同的任务关联(即:执行此代码的任务),它将清除当前任务(完成任务中的所有活动)并启动新实例Activity进入当前任务。如果用户按下BACK键,这将完成Activity并完成当前任务(因为任务中只有1个活动)并将用户返回到HOME屏幕或启动此任务的任务(任务堆栈中此任务下面的任务。)
  2. 如果Activity具有与当前任务不同的任务关联,并且已存在具有该任务关联的现有任务(即:Activity将属于的现有任务),那么将任务置于前台,清除(任务中的所有活动都已完成),在任务的根目录下创建Activity的新实例,并将此任务置于当前任务之上(以便在Activity完成后,用户将被放回当前任务中。
  3. 如果Activity具有与当前任务不同的任务关联,并且没有具有该任务关联的现有任务,则会创建新任务并在根目录中创建新的Activity实例任务和此任务放在当前任务之上(这样当Activity完成时,用户将被放回当前任务中。)

  4. 此代码段...

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

    ...将根据以下内容执行以下操作之一...

    1. 如果Activity与当前任务具有相同的任务关联(即:执行此代码的任务)并且Activity是当前任务的根活动,则不会执行任何操作。它不会启动新任务,也不会清除任何活动,也不会创建Activity的新实例,也不会改变当前任务完成时发生的行为(即:当前任务由另一个任务启动,当前任务中的所有活动都完成后,它会将用户放回到任务堆栈中的上一个任务中。)
    2. 如果Activity与当前任务具有相同的任务关联(即:执行此代码的任务),并且Activity ,则根目录当前任务,这将只创建一个Activity的新实例,并将其置于当前任务的当前活动之上。它不会启动新任务,也不会清除任何活动,也不会改变当前任务完成时发生的行为(即:当前任务是由另一个任务启动的,当前任务是当前任务任务完成后,它会将用户放回任务堆栈中的上一个任务中。)
    3. 如果Activity具有与当前任务不同的任务关联,并且已存在具有该任务关联的现有任务(即:Activity将属于的现有任务)和{{1这是现有任务的根活动,然后将现有任务带到前台,并将该任务与任务堆栈分离(即:当该任务中的所有活动完成时,它将使用户返回到HOME屏幕和到启动该任务的任务。)
    4. 如果Activity具有与当前任务不同的任务关联,并且已存在具有该任务关联的现有任务(即:Activity将属于的现有任务)和{{1 是现有任务的根活动,然后将现有任务带到前台,并将该任务与任务堆栈分离(即:当该任务中的所有活动都完成时,它将用户返回到HOME屏幕并将返回到启动该任务的任务),并创建Activity的新实例并将其置于该任务中的任何现有活动之上。 / LI>
    5. 如果Activity具有与当前任务不同的任务关联,并且没有具有该任务关联的现有任务,则会创建新任务并在根目录中创建新的Activity实例任务和新任务与任务堆栈分离(这样当Activity完成时,用户返回到HOME屏幕,返回到启动它的任务。)< / LI>

      最后,这个片段......

      Activity

      ...将执行以下任务之一,具体取决于......

      1. 如果Activity与当前任务具有相同的任务关联(即:执行此代码的任务),它将清除当前任务(完成任务中的所有活动)并启动新实例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); 进入当前任务。如果用户按下BACK键,这将完成Activity并完成当前任务(因为任务中只有1个活动)并将用户返回到HOME屏幕。
      2. 如果Activity具有与当前任务不同的任务关联,并且已存在具有该任务关联的现有任务(即:Activity将属于的现有任务),那么将任务置于前台,清除(任务中的所有活动都已完成),在任务的根目录下创建Activity的新实例,并将此任务与任务堆栈分离(以便{{{} 1}}完成后,用户返回到HOME屏幕。)
      3. 如果Activity具有与当前任务不同的任务关联,并且没有具有该任务关联的现有任务,则会创建新任务并在根目录中创建新的Activity实例任务和此任务与任务堆栈分离(这样当Activity完成时,用户将返回到HOME屏幕。)

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