Intent启动Activity的Flag

除了常用的flag之外, 主要记录一下容易忘记,但很重要的flag.

1, FLAG_ACTIVITY_NEW_DOCUMENT

这个flag的在Api21以前是FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET. 主要作用就是当Activity所在的Task被reset之后, 使用此Flag 发送Intent的Activity实例之上的所有Activity都会被销毁. 一个很典型的例子就是当我们从launcher界面重新启动一个位于后台的App的时候, 会自动加上FLAG_ACTIVITY_RESET_TASK_IF_NEEDED, 意味着必要时重置Task, 而如果从Recent app list 中回到位于后台的App的时候, 就不会加上这个flag.

我们通过一个例子来看看两者的差别.

TaskApp中有三个Activity. 分别是ActivityOne, ActivityTwo, ActivityThree. 启动顺序分别是: 默认Launch的是ActivityOne, ActivityOne可以跳转到ActivityTwo, 代码如下:

Intent intent  = new Intent(this, ActivityTwo.class);
startActivity(intent);

ActivityTwo可以跳转到ActivityThree, 代码如下:

Intent intent  = new Intent(this, ActivityThree.class);
startActivity(intent);

ActivityThree跳转到ActivityOne, 并且加上了FLAG_ACTIVITY_NEW_DOCUMENT, 代码如下:

Intent intent  = new Intent(this, ActivityOne.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
startActivity(intent);

测试流程如下Log所示:

//Launch ActivityOne
03-10 11:45:40.705 D/1 +FredCao(21483): onCreate: , taskId is: 229, processId is: 21483
03-10 11:45:40.705 D/1 +FredCao(21483): onStart: , taskId is: 229, processId is: 21483
03-10 11:45:40.715 D/1 +FredCao(21483): onResume: , taskId is: 229, processId is: 21483

//从ActivityOne跳转到ActivityTwo
03-10 11:45:43.055 D/1 +FredCao(21483): onPause: , taskId is: 229, processId is: 21483
03-10 11:45:43.075 D/2 +FredCao(21483): onCreate: , taskId is: 229, processId is: 21483
03-10 11:45:43.075 D/2 +FredCao(21483): onCreate: com.example.fredwang.tasktwo.ActivityTwo@2955aa40
03-10 11:45:43.085 D/2 +FredCao(21483): onStart: , taskId is: 229, processId is: 21483
03-10 11:45:43.085 D/2 +FredCao(21483): onResume: , taskId is: 229, processId is: 21483
03-10 11:45:43.565 D/1 +FredCao(21483): onStop: , taskId is: 229, processId is: 21483

//从ActivityTwo跳转到ActivityThree
03-10 11:45:46.485 D/2 +FredCao(21483): onPause: , taskId is: 229, processId is: 21483
03-10 11:45:46.515 D/3 +FredCao(21483): onCreate: , taskId is: 229, processId is: 21483
03-10 11:45:46.515 D/3 +FredCao(21483): onStart: , taskId is: 229, processId is: 21483
03-10 11:45:46.515 D/3 +FredCao(21483): onResume: , taskId is: 229, processId is: 21483
03-10 11:45:46.995 D/2 +FredCao(21483): onStop: , taskId is: 229, processId is: 21483

//从ActivityThree重新跳转到ActivityOne
03-10 11:45:49.275 D/3 +FredCao(21483): onPause: , taskId is: 229, processId is: 21483
03-10 11:45:49.305 D/1 +FredCao(21483): onCreate: , taskId is: 229, processId is: 21483
03-10 11:45:49.315 D/1 +FredCao(21483): onStart: , taskId is: 229, processId is: 21483
03-10 11:45:49.315 D/1 +FredCao(21483): onResume: , taskId is: 229, processId is: 21483
03-10 11:45:49.795 D/3 +FredCao(21483): onStop: , taskId is: 229, processId is: 21483

//从ActivityOne跳转到ActivityTwo
03-10 11:45:51.795 D/1 +FredCao(21483): onPause: , taskId is: 229, processId is: 21483
03-10 11:45:51.825 D/2 +FredCao(21483): onCreate: , taskId is: 229, processId is: 21483
03-10 11:45:51.825 D/2 +FredCao(21483): onCreate: com.example.fredwang.tasktwo.ActivityTwo@3df94618
03-10 11:45:51.825 D/2 +FredCao(21483): onStart: , taskId is: 229, processId is: 21483
03-10 11:45:51.825 D/2 +FredCao(21483): onResume: , taskId is: 229, processId is: 21483
03-10 11:45:52.295 D/1 +FredCao(21483): onStop: , taskId is: 229, processId is: 21483

//Press Home键. 回到Launcher
03-10 11:45:55.245 D/2 +FredCao(21483): onPause: , taskId is: 229, processId is: 21483
03-10 11:45:55.385 D/2 +FredCao(21483): onStop: , taskId is: 229, processId is: 21483

这时候如果从Launcher点击App图标, 结果如下:

//ActivityOne和ActicityTwo分别被销毁. ActivityThree重新被显示
03-10 11:45:59.515 D/1 +FredCao(21483): onDestroy: , taskId is: 229, processId is: 21483
03-10 11:45:59.525 D/2 +FredCao(21483): onDestroy: , taskId is: 229, processId is: 21483
03-10 11:45:59.545 D/3 +FredCao(21483): onStart: , taskId is: 229, processId is: 21483
03-10 11:45:59.545 D/3 +FredCao(21483): onResume: , taskId is: 229, processId is: 21483
03-10 11:46:59.475 D/3 +FredCao(21483): onPause: , taskId is: 229, processId is: 21483
03-10 11:46:59.475 D/3 +FredCao(21483): onStop: , taskId is: 229, processId is: 21483

如果从Recent App List打开位于后台的App, 结果如下:

//只有原本位于Task顶层的ActivityTwo被显示出来.
03-10 11:51:45.615 D/2 +FredCao(21483): onStart: , taskId is: 229, processId is: 21483
03-10 11:51:45.615 D/2 +FredCao(21483): onResume: , taskId is: 229, processId is: 21483

2. FLAG_ACTIVITY_CLEAR_TOP
清除掉此Activity所在Task中的所有在它上面的实例. 并且如果只有这一个flag, 通过intent开启的activity也会销毁并重新创建. 举例说明.
此时ActivityThree跳转到ActivityOne的代码如下:

Intent intent  = new Intent(this, ActivityOne.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

此时按照以下流程依次跳转Activity的Log如下:

//Launch ActivityOne
03-10 13:52:54.105 D/1 +FredCao(15367): onCreate: , taskId is: 231, processId is: 15367
03-10 13:52:54.105 D/1 +FredCao(15367): onStart: , taskId is: 231, processId is: 15367
03-10 13:52:54.105 D/1 +FredCao(15367): onResume: , taskId is: 231, processId is: 15367

//通过ActivityOne跳转到ActivityTwo
03-10 13:52:55.865 D/1 +FredCao(15367): onPause: , taskId is: 231, processId is: 15367
03-10 13:52:55.905 D/2 +FredCao(15367): onCreate: , taskId is: 231, processId is: 15367
03-10 13:52:55.905 D/2 +FredCao(15367): onCreate: com.example.fredwang.tasktwo.ActivityTwo@19ec8942
03-10 13:52:55.905 D/2 +FredCao(15367): onStart: , taskId is: 231, processId is: 15367
03-10 13:52:55.905 D/2 +FredCao(15367): onResume: , taskId is: 231, processId is: 15367

//通过ActivityTwo跳转到ActivityThree
03-10 13:52:56.385 D/1 +FredCao(15367): onStop: , taskId is: 231, processId is: 15367
03-10 13:52:57.635 D/2 +FredCao(15367): onPause: , taskId is: 231, processId is: 15367
03-10 13:52:57.665 D/3 +FredCao(15367): onCreate: , taskId is: 231, processId is: 15367
03-10 13:52:57.665 D/3 +FredCao(15367): onStart: , taskId is: 231, processId is: 15367
03-10 13:52:57.665 D/3 +FredCao(15367): onResume: , taskId is: 231, processId is: 15367
03-10 13:52:58.155 D/2 +FredCao(15367): onStop: , taskId is: 231, processId is: 15367

//通过ActivityThree再次重新跳转到ActivityOne, 
//看到ActivityTwo首先被销毁
03-10 13:52:58.705 D/2 +FredCao(15367): onDestroy: , taskId is: 231, processId is: 15367
03-10 13:52:58.725 D/3 +FredCao(15367): onPause: , taskId is: 231, processId is: 15367

//ActivityOne随之也被销毁, 并且重新创建
03-10 13:52:58.735 D/1 +FredCao(15367): onDestroy: , taskId is: 231, processId is: 15367
03-10 13:52:58.765 D/1 +FredCao(15367): onCreate: , taskId is: 231, processId is: 15367
03-10 13:52:58.765 D/1 +FredCao(15367): onStart: , taskId is: 231, processId is: 15367
03-10 13:52:58.775 D/1 +FredCao(15367): onResume: , taskId is: 231, processId is: 15367

//最后ActivityThree被销毁
03-10 13:52:59.145 D/3 +FredCao(15367): onStop: , taskId is: 231, processId is: 15367
03-10 13:52:59.145 D/3 +FredCao(15367): onDestroy: , taskId is: 231, processId is: 15367

但是如果配合配合FLAG_ACTIVITY_SINGLE_TOP使用,则 ActivityOne 不会销毁只销毁ActivityOne以上实例,然后ActivityOne 执行onNewIntent -> onStart
代码如下:

Intent intent  = new Intent(this, ActivityOne.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
        Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

ActivityThree跳转到ActivityOne的Log如下:

//ActivityTwo被销毁
03-10 14:03:20.415 D/2 +FredCao( 5447): onDestroy: , taskId is: 232, processId is: 5447
03-10 14:03:20.445 D/3 +FredCao( 5447): onPause: , taskId is: 232, processId is: 5447

//ActivityOne被新的Intent重新唤起
03-10 14:03:20.465 D/1 +FredCao( 5447): onNewIntent: , taskId is: 232, processId is: 5447
03-10 14:03:20.465 D/1 +FredCao( 5447): onStart: , taskId is: 232, processId is: 5447
03-10 14:03:20.475 D/1 +FredCao( 5447): onResume: , taskId is: 232, processId is: 5447

//ActivityThree被销毁
03-10 14:03:20.825 D/3 +FredCao( 5447): onStop: , taskId is: 232, processId is: 5447
03-10 14:03:20.825 D/3 +FredCao( 5447): onDestroy: , taskId is: 232, processId is: 5447

3. FLAG_ACTIVITY_NO_HISTORY
使用这个flag打开的Activity不会存储实例在Task中, 回退时自动销毁.
在ActivityOne打开ActivityTwo的时候加上这个flag, 代码如下:

Intent intent  = new Intent(this, ActivityTwo.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);

运行时,按照one->two->three的打开方式, 然后回退, Log如下:

//launch ActivityOne
03-10 14:24:06.715 D/1 +FredCao(10236): onCreate: , taskId is: 244, processId is: 10236
03-10 14:24:06.715 D/1 +FredCao(10236): onStart: , taskId is: 244, processId is: 10236
03-10 14:24:06.715 D/1 +FredCao(10236): onResume: , taskId is: 244, processId is: 10236

//ActivityOne跳转到ActivityTwo
03-10 14:24:13.665 D/1 +FredCao(10236): onPause: , taskId is: 244, processId is: 10236
03-10 14:24:13.695 D/2 +FredCao(10236): onCreate: , taskId is: 244, processId is: 10236
03-10 14:24:13.695 D/2 +FredCao(10236): onCreate: com.example.fredwang.tasktwo.ActivityTwo@3d55c593
03-10 14:24:13.695 D/2 +FredCao(10236): onStart: , taskId is: 244, processId is: 10236
03-10 14:24:13.705 D/2 +FredCao(10236): onResume: , taskId is: 244, processId is: 10236
03-10 14:24:14.205 D/1 +FredCao(10236): onStop: , taskId is: 244, processId is: 10236

//ActivityTwo跳转到ActivityThree
03-10 14:24:17.085 D/2 +FredCao(10236): onPause: , taskId is: 244, processId is: 10236
03-10 14:24:17.115 D/3 +FredCao(10236): onCreate: , taskId is: 244, processId is: 10236
03-10 14:24:17.115 D/3 +FredCao(10236): onStart: , taskId is: 244, processId is: 10236
03-10 14:24:17.125 D/3 +FredCao(10236): onResume: , taskId is: 244, processId is: 10236
03-10 14:24:17.615 D/2 +FredCao(10236): onStop: , taskId is: 244, processId is: 10236

//Back键从ActivityThree回撤
03-10 14:24:21.115 D/3 +FredCao(10236): onPause: , taskId is: 244, processId is: 10236

//直接回退到ActivityOne
03-10 14:24:21.125 D/1 +FredCao(10236): onStart: , taskId is: 244, processId is: 10236
03-10 14:24:21.135 D/1 +FredCao(10236): onResume: , taskId is: 244, processId is: 10236

//ActivityTwo被销毁
03-10 14:24:21.185 D/2 +FredCao(10236): onDestroy: , taskId is: 244, processId is: 10236
03-10 14:24:21.485 D/3 +FredCao(10236): onStop: , taskId is: 244, processId is: 10236
03-10 14:24:21.485 D/3 +FredCao(10236): onDestroy: , taskId is: 244, processId is: 10236

4. FLAG_ACTIVITY_REORDER_TO_FRONT
如果设置这个标记,被启动的Activity将会放到它所属task的最前面
例如,有一个Task包含4个Activity:A,B,C,D.如果D通过调用startActivity( )来启动B,如果使用了这个标记,B将会排在这个task的最上面(直接执行onNewIntent),也即现在的顺序变成了A,C,D,B。
如果使用了FLAG_ACTIVITY_CLEAR_TOP,这个标记将会被忽略。

5. FLAG_ACTIVITY_TASK_ON_HOME
如果从AppOne中跳转到AppTwo的Activity 被设置了这个标志, 如果AppTwo没有Task存在, 则ActivityTwo自己开辟一个Task, 并且位于栈底, Back回退后直接回到Home. 如果AppTwo已经有Task存在, 则会重新宿主到AppTwo的Task中.
这个标志需要配合FLAG_ACTIVITY_NEW_TASK一起使用.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值