Activity task,lanchMode相关学习

Android的task可以理解为管理activity的堆栈。

Adnroid启动模式可以有如下两种方式设定。

  1. 通过在AndroidMenifest.xml中设置launchMode.

  2. 代码中调用startActivity时设置intent.setFlags

首先看launchMode

launchMode=”standard”

standard为默认模式。

不论是否在task中已经存在该activity,都会生成新的activity(调用onCreate),然后保存在task堆栈中。

launchMode=”singleTop”

根据task顶部的activity,动作会不同。

task顶部存在相同的Activity,不会生成新的Activity,而是直接调用显示已经存在的Activity(onNewIntent会被调用)。task 顶部存在不同的Activity时,动作与standard模式相同。

図4: singleTop

launchMode=”singleTask”

task顶部存在相同的Activity,该Activity之前的Activity会全部被删除(finish)。并且该Activity对象的onNewIntent被调用。

task 中不存在所要调用的Activity时,动作与standard模式相同。

図5: singleTask

launchMode=”singleInstance”

设定为singleInstance时,总是生成只包含该Activity的新task。

被其他Acticity调用时,如果该Activity已经存在,那么包含该Activity的task会显示在前台Foreground。

図6: singleInstance


确认Task・Activity的状态

$ adb shell dumpsys activity activities

上面的命令会出现很多信息,可以用如下命令进行筛选。

$ adb shell dumpsys activity activities | grep "* TaskRecord\|* Hist"

以下是输出结果。

  * TaskRecord{425b6348 #121 A jp.qoncept.activitystack2}
    * Hist #6: ActivityRecord{422a2d98 jp.qoncept.activitystack2/.Activity3}
    * Hist #5: ActivityRecord{4197a3e8 jp.qoncept.activitystack2/.Activity2}
    * Hist #4: ActivityRecord{4177c190 jp.qoncept.activitystack2/.Activity1}
  * TaskRecord{4178ac50 #120 A jp.qoncept.activitystack1}
    * Hist #3: ActivityRecord{41c6be08 jp.qoncept.activitystack1/.Activity3}
    * Hist #2: ActivityRecord{41c58090 jp.qoncept.activitystack1/.Activity2}
  * TaskRecord{424a6d18 #119 A jp.qoncept.activitystack1}
    * Hist #1: ActivityRecord{417b5cf0 jp.qoncept.activitystack1/.Activity1}
  * TaskRecord{422c2960 #4 A com.sonyericsson.home}
    * Hist #0: ActivityRecord{422c15e0 com.sonyericsson.home/.HomeActivity}


下面是设置Intent flags

举例说,从A→B→C→D多数的Activity跳转到最初的A。

DActivity.java

Intent intent = new Intent(DActivity.this, AActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(intent);
  • FLAG_ACTIVITY_CLEAR_TOP,要跳转的Activity已经存在,那么将会把它堆栈之上的(B,C,D)删除。这样实现A→B→C→D→A之后按下back键时不能返回到D。

  • FLAG_ACTIVITY_SINGLE_TOP,如果要跳转到已经存在的Activity时不会生成新的Activity,而是掉出已经存在的Activity对象

  • FLAG_ACTIVITY_MULTIPLE_TASK 
        不要使用这个标志,除非你自己实现了应用程序启动器。与FLAG_ACTIVITY_NEW_TASK结合起来使用,可以禁用把已存的Task送入前台的 行为。当设置时,新的Task总是会启动来处理Intent,而不管这是是否已经有一个Task可以处理相同的事情。
        由于默认的系统不包含图形Task管理功能,因此,你不应该使用这个标志,除非你提供给用户一种方式可以返回到已经启动的Task。
        如果FLAG_ACTIVITY_NEW_TASK标志没有设置,这个标志被忽略。

  • FLAG_ACTIVITY_NEW_TASK 
        如果设置,这个Activity会成为历史stack中一个新Task的开始。一个Task(从启动它的Activity到下一个Task中的 Activity)定义了用户可以迁移的Activity原子组。Task可以移动到前台和后台;在某个特定Task中的所有Activity总是保持相 同的次序。
        这个标志一般用于呈现“启动”类型的行为:它们提供用户一系列可以单独完成的事情,与启动它们的Activity完全无关。
        使用这个标志,如果正在启动的Activity的Task已经在运行的话,那么,新的Activity将不会启动;代替的,当前Task会简单的移入前台。参考FLAG_ACTIVITY_MULTIPLE_TASK标志,可以禁用这一行为。
        这个标志不能用于调用方对已经启动的Activity请求结果。


参考如下文章:

http://www.blogjava.net/zhaojianhua/archive/2011/06/23/352888.html

http://techblog.qoncept.jp/?p=102

http://d.hatena.ne.jp/nkawamura/20130829/1377744732

http://www.saturn.dti.ne.jp/npaka/android/LaunchMode/




转载于:https://my.oschina.net/u/2317656/blog/413808

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值