来自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
代码段会如何表现呢?
答案 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);
...将执行以下任务之一,具体取决于......
Activity
与当前任务具有相同的任务关联(即:执行此代码的任务),它将清除当前任务(完成任务中的所有活动)并启动新实例Activity
进入当前任务。如果用户按下BACK键,这将完成Activity
并完成当前任务(因为任务中只有1个活动)并将用户返回到HOME屏幕或启动此任务的任务(任务堆栈中此任务下面的任务。)Activity
具有与当前任务不同的任务关联,并且已存在具有该任务关联的现有任务(即:Activity
将属于的现有任务),那么将任务置于前台,清除(任务中的所有活动都已完成),在任务的根目录下创建Activity
的新实例,并将此任务置于当前任务之上(以便在Activity
完成后,用户将被放回当前任务中。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);
...将根据以下内容执行以下操作之一...
Activity
与当前任务具有相同的任务关联(即:执行此代码的任务)并且Activity
是当前任务的根活动,则不会执行任何操作。它不会启动新任务,也不会清除任何活动,也不会创建Activity
的新实例,也不会改变当前任务完成时发生的行为(即:当前任务由另一个任务启动,当前任务中的所有活动都完成后,它会将用户放回到任务堆栈中的上一个任务中。)Activity
与当前任务具有相同的任务关联(即:执行此代码的任务),并且Activity
不,则根目录当前任务,这将只创建一个Activity
的新实例,并将其置于当前任务的当前活动之上。它不会启动新任务,也不会清除任何活动,也不会改变当前任务完成时发生的行为(即:当前任务是由另一个任务启动的,当前任务是当前任务任务完成后,它会将用户放回任务堆栈中的上一个任务中。)Activity
具有与当前任务不同的任务关联,并且已存在具有该任务关联的现有任务(即:Activity
将属于的现有任务)和{{1这是现有任务的根活动,然后将现有任务带到前台,并将该任务与任务堆栈分离(即:当该任务中的所有活动完成时,它将使用户返回到HOME屏幕和不到启动该任务的任务。)Activity
具有与当前任务不同的任务关联,并且已存在具有该任务关联的现有任务(即:Activity
将属于的现有任务)和{{1 不是现有任务的根活动,然后将现有任务带到前台,并将该任务与任务堆栈分离(即:当该任务中的所有活动都完成时,它将用户返回到HOME屏幕并将不返回到启动该任务的任务),并创建Activity
的新实例并将其置于该任务中的任何现有活动之上。 / LI>
Activity
具有与当前任务不同的任务关联,并且没有具有该任务关联的现有任务,则会创建新任务并在根目录中创建新的Activity
实例任务和新任务与任务堆栈分离(这样当Activity
完成时,用户返回到HOME屏幕,不返回到启动它的任务。)< / LI>
醇>
最后,这个片段......
Activity
...将执行以下任务之一,具体取决于......
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屏幕。Activity
具有与当前任务不同的任务关联,并且已存在具有该任务关联的现有任务(即:Activity
将属于的现有任务),那么将任务置于前台,清除(任务中的所有活动都已完成),在任务的根目录下创建Activity
的新实例,并将此任务与任务堆栈分离(以便{{{} 1}}完成后,用户返回到HOME屏幕。)Activity
具有与当前任务不同的任务关联,并且没有具有该任务关联的现有任务,则会创建新任务并在根目录中创建新的Activity
实例任务和此任务与任务堆栈分离(这样当Activity
完成时,用户将返回到HOME屏幕。)我意识到这个答案是漫长而复杂的,但是有很多不同的情况。我可能甚至没有涵盖所有可能的情况(例如,如果Activity
有特殊的启动模式)......