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

kol*_*vra 56 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);
Run Code Online (Sandbox Code Playgroud)

Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

我理解的方式,在任何代码片段,我们创造它只有在活动是一项新的任务,而当你按下回你到主屏幕.假设我可能弄错了,两者之间有什么区别?另外,如果我有另一个片段,Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME | Intent.FLAG_ACTIVITY_CLEAR_TASK它会如何表现?

Dav*_*ser 117

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

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

  • 任务也是"堆叠"的.如果您处于任务中A并且启动了新任务B,则任务B将叠加在任务之上A.如果用户在任务中按下BACK键足够多次B,他最终将返回任务"A".这是标准的Android行为.

你的片段......

Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

......将做以下事情中的一件,具体取决于......

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

这段代码片段......

Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

......将根据以下事项做以下事情之一......

  1. 如果Activity具有与当前任务相同的任务关联(即:执行此代码的任务)并且Activity是当前任务的根活动,则这将不执行任何操作.它不会启动新任务,它不会清除任何活动,也不会创建新的实例Activity,也不会改变当前任务完成时发生的行为(即:如果当前任务是由当前任务启动的话)另一项任务是,当前任务中的所有活动都完成后,它会将用户放回任务堆栈中的上一个任务中.
  2. 如果Activity有相同的任务亲和力当前的任务(即:从该代码执行的任务),并Activity不是当前任务的根系活力,这将只需创建一个新的实例Activity,并把它放在当前活动的顶部在当前的任务中.它不会启动新任务,也不会清除任何活动,也不会改变当前任务完成时发生的行为(即:当前任务是由另一个任务启动的,当前任务是当前任务任务完成后,它会将用户放回任务堆栈中的上一个任务中).
  3. 如果Activity具有与当前任务不同的任务关联,并且已存在具有该任务关联的现有任务(即:Activity将属于的现有任务)并且Activity是该现有任务的根活动,则该现有任务将被带到前台和该任务与任务堆栈分离(即:当该任务中的所有活动完成时,它将使用户返回到HOME屏幕而不是启动该任务的任务).
  4. 如果Activity有比当前任务不同的任务亲和力,且已经存在与该任务亲和力(即:现有的任务,现有的任务Activity将属于),并Activity不是现有任务的根系活力,那么,现有的任务带来了到前台并且该任务与任务堆栈分离(即:当该任务中的所有活动都完成时,它将使用户返回到HOME屏幕而不是启动该任务的任务)并Activity创建一个新实例并放在该任务的任何现有活动之上.
  5. 如果Activity具有与当前任务不同的任务关联,并且没有具有该任务关联的现有任务,则创建新Activity任务并在任务的根处创建新实例,并且新任务与任务堆栈分离(这样一旦Activity完成,用户将返回到HOME屏幕,而不是返回到启动它的任务).

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

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);
Run Code Online (Sandbox Code Playgroud)

......将做以下事情中的一件,具体取决于......

  1. 如果Activity具有与当前任务相同的任务关联(即:执行此代码的任务),它将清除当前任务(完成任务中的所有活动)并启动Activity当前任务的新实例.如果用户按下BACK键,这将完成Activity并完成当前任务(因为任务中只有1个活动)并将用户返回到HOME屏幕.
  2. 如果Activity具有与当前任务不同的任务关联,并且已存在具有该任务关联的现有任务(即:Activity将属于的现有任务),则将该现有任务带到前台,清除(所有活动在任务完成),Activity在任务的根目录下创建一个新实例,并将此任务与任务堆栈分离(这样,当Activity完成时,用户将返回到HOME屏幕).
  3. 如果Activity具有与当前任务不同的任务关联,并且没有具有该任务关联的现有任务,则创建新Activity任务并在任务的根处创建新实例,并且此任务与任务堆栈分离(这样当Activity完成时,用户返回到HOME屏幕).

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