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

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

我的理解是,在任何一个代码片段中,我们都会创build一个新的任务,其中只有Activity,而当您按回时,您将进入主屏幕。 假设我可能弄错了,两者有什么区别? 另外,如果我有另一个与Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME | Intent.FLAG_ACTIVITY_CLEAR_TASK片段 Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME | Intent.FLAG_ACTIVITY_CLEAR_TASK Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME | Intent.FLAG_ACTIVITY_CLEAR_TASK这将如何performance?

这两个片段之间有区别。 这里有一些重要的背景信息:

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

  • 任务也是“堆叠的”。 如果您在任务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并完成当前任务(因为任务中只有一个活动),并将用户返回到HOME屏幕或启动此任务的任务(任务是在任务堆栈中的任务下面)。
  2. 如果Activity具有与当前任务不同的任务关系,并且已经存在具有该任务关系的现有任务(即: Activity将属于的现有任务),则将该现有任务带到前台,清除(所有活动在任务完成后),在任务的根目录下创build一个新的Activity实例,并将此任务放在当前任务的顶部(这样当Activity完成时,用户就会退回到当前任务中)。
  3. 如果Activity具有与当前任务不同的任务关系,并且没有具有该任务关系的现有任务,则会创build一个新任务,并在该任务的根目录创build一个新的Activity实例,并将此任务放在当前的任务(这样当Activity完成时,用户将退回到当前任务中)。

此代码段…

 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是当前任务的根活动,则此操作无效。 它不会启动一个新的任务,它不会清除任何活动,也不会创build一个新的Activity实例,并且不会改变当前任务完成时发生的行为(即:如果当前任务已经启动通过另一个任务,当前任务中的所有活动都完成后,将把用户放回到任务堆栈中的前一个任务中)。
  2. 如果Activity与当前任务具有相同的任务关系(即执行此代码的任务),并且Activity 不是当前任务的根活动,则只会创build一个新的Activity实例,并将其置于当前任务中的当前活动。 它不会开始一个新的任务,它不会清除任何活动,也不会改变当前任务完成后会发生什么事情的行为(即:如果当前任务是由另一个任务启动的,当前所有活动任务完成后,会将用户放回任务堆栈中的前一个任务)。
  3. 如果Activity具有与当前任务不同的任务亲和力,并且已经存在具有该任务亲和力的现有任务(即:该Activity将属于的现有任务),并且Activity是该现有任务的根活动,则该现有任务被带到前台,这个任务从任务堆栈中分离出来(即:当任务中的所有活动完成后,它将把用户返回到主屏幕而不是开始该任务的任务)。
  4. 如果“ Activity与当前任务具有不同的任务亲缘关系,并且已有一个具有该任务亲缘关系的现有任务(即:“ Activity将属于的现有任务),而“ Activity 不是该现有任务的根活动,任务被带到前台,这个任务与任务栈分离(即:当任务中的所有活动完成后,它将把用户返回到主屏幕而不是开始任务的任务)和一个新的实例“ Activity被创build并放置在该任务的任何现有活动之上。
  5. 如果“ Activity具有与当前任务不同的任务关系,并且没有具有该任务关联的现有任务,则会创build一个新任务,并在该任务的根目录创build一个新的“实例”,并将新任务与任务堆栈(这样当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); 

…将做以下事情之一,取决于…

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

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