Android中FLAG_ACTIVITY_CLEAR_TASK的作用

转:http://laokaddk.blog.51cto.com/368606/1363827 


FLAG_ACTIVITY_CLEAR_TASK :如果在调用Context.startActivity时传递这个标记,将会导致任何用来放置该activity的已经存在的task里面的已经存在的activity先清空,然后该activity再在该task中启动,也就是说,这个新启动的activity变为了这个空tas的根activity.所有老的activity都结束掉。该标志必须和FLAG_ACTIVITY_NEW_TASK一起使用。

示例:

我们有三个activity:MainActivity、ActivityA、ActivityB. 依次从MainActivity中启动ActivityA,从ActivityA中启动ActivityB.

首先我们所有的都使用缺省的,也即没有设置taskAffinity、launchMode,启动activity时Intent也不带标记,我们看一下启动B之后的堆栈:


  1. ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)    

  2.  Main stack:    

  3.    TaskRecord{4199dd68 #56 A com.leaves.ipanel U 0}    

  4.    Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }    

  5.      Hist #3: ActivityRecord{4140fdf8 u0 com.leaves.ipanel/.ActivityB}    

  6.        Intent { act=com.leaves.ipanel.ActivityB cmp=com.leaves.ipanel/.ActivityB }    

  7.        ProcessRecord{41517e80 13350:com.leaves.ipanel/u0a10061}    

  8.      Hist #2: ActivityRecord{413ff7e8 u0 com.leaves.ipanel/.ActivityA}    

  9.        Intent { act=com.leaves.ipanel.ActivityA cmp=com.leaves.ipanel/.ActivityA }    

  10.        ProcessRecord{41517e80 13350:com.leaves.ipanel/u0a10061}    

  11.      Hist #1: ActivityRecord{413f8b28 u0 com.leaves.ipanel/.MainActivity}    

  12.        Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }    

  13.        ProcessRecord{41517e80 13350:com.leaves.ipanel/u0a10061}    

  14.    TaskRecord{41350f60 #2 A com.android.launcher U 0}    

  15.    Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10600000 cmp=com.android.launcher/com.android.launcher2.Launcher }    

  16.      Hist #0: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher}    

  17.        Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }    

  18.        ProcessRecord{41615818 628:com.android.launcher/1000}    

可以看到三者在同一个task中,且都存在。



接下来我们在启动ActivityB时添加FLAG_ACTIVITY_CLEAR_TASK和FLAG_ACTIVITY_NEW_TASK

  1. publicvoid onClick(View v) {    

  2. // TODO Auto-generated method stub  

  3.    Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());      

  4.    Intent intent = new Intent("com.leaves.ipanel.ActivityB");      

  5.    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);    

  6.    startActivity(intent);    

  7. }    

再看下启动ActivityB之后的堆栈:


  1. ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)    

  2.  Main stack:    

  3.    TaskRecord{4245bd10 #57 A com.leaves.ipanel U 0}    

  4.    Intent { act=com.leaves.ipanel.ActivityB flg=0x10008000 cmp=com.leaves.ipanel/.ActivityB }    

  5.      Hist #1: ActivityRecord{413f8b28 u0 com.leaves.ipanel/.ActivityB}    

  6.        Intent { act=com.leaves.ipanel.ActivityB flg=0x10008000 cmp=com.leaves.ipanel/.ActivityB }    

  7.        ProcessRecord{41413010 13441:com.leaves.ipanel/u0a10061}    

  8.    TaskRecord{41350f60 #2 A com.android.launcher U 0}    

  9.    Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10600000 cmp=com.android.launcher/com.android.launcher2.Launcher }    

  10.      Hist #0: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher}    

  11.        Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }    

  12.        ProcessRecord{41615818 628:com.android.launcher/1000}    

可以看到,MainActivity和ActivityA都被结束掉了,原因就是因为该task用来装载ActivityB,而启动时又设置了FLAG_ACTIVITY_CLEAR_TASK和FLAG_ACTIVITY_NEW_TASK
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: flag_activity_clear_task是一个Activity的启动模式,它可以清除任务栈的所有Activity,使得新启动的Activity成为任务栈的唯一Activity。这个标志通常用于启动应用程序的主Activity,以确保用户按下返回键时不会返回到之前的Activity。 ### 回答2: flag_activity_clear_taskAndroid的一个标志位,用于启动一个新的Activity时清除Activity堆栈的所有Activity。 在Android,每个Activity都会被放置在一个堆栈,当我们启动新的Activity时,原有的Activity会被保留在堆栈。当我们按下返回键时,系统会按照堆栈的顺序依次销毁并恢复Activity。 但是在某些情况下,我们可能需要启动一个新的Activity后,清除掉之前所有的Activity,使得用户无法通过返回键回到之前的页面。这时就可以使用flag_activity_clear_task标志位。 当我们使用flag_activity_clear_task标志位启动一个新的Activity时,系统会销毁掉Activity堆栈的所有Activity,并在堆栈放置新的Activity,使之成为栈底的Activity。 这种使用场景通常发生在登录功能。当用户成功登录后,我们需要清除掉登录之前的Activity堆栈,以防止用户通过返回键回到未登录的页面。 我们可以在启动Activity时使用Intent的setFlags方法设置flag_activity_clear_task标志位,示例代码如下: ``` Intent intent = new Intent(this, NewActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); ``` 总之,flag_activity_clear_task是一个非常有用的标志位,可以让我们在需要的时候清空Activity堆栈,并启动一个新的Activity。这样可以提供更好的用户体验,同时满足特定功能需求。 ### 回答3: 在Android,flag_activity_clear_task是一个用于Intent的标志位。当我们在启动一个Activity时,可以通过在Intent设置该标志位来实现一些特定的行为。 使用flag_activity_clear_task标志位,可以实现以下效果: 1. 清除任务栈:当我们使用该标志位启动一个Activity时,系统会先清空任务栈的所有Activity,然后再启动指定的Activity。这意味着在新的Activity启动后,之前在任务栈的所有Activity都会被销毁,任务栈重新变为空白状态。 2. 单一实例:如果我们在Manifest文件设置了一个Activity的launchMode为singleTask,并且在启动该Activity时使用了flag_activity_clear_task标志位,那么系统会先清空任务栈的所有Activity,然后再创建一个新的实例来启动该Activity。这样可以确保该Activity在任务栈只存在一个实例。 总之,flag_activity_clear_task标志位可以用于清除任务栈Activity,重新创建一个新的任务栈,或者确保某个Activity在任务栈只有一个实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值