Android中的Activity生命周期以及Task小结

关于activity和task的理解,网上可以找到一箩筐,中文的英文的,不过那始终是别人的理解,这里按照自己的思维习惯记录一下。

1、什么是task?

在Android中Task是为了完成特定功能的一些列activity的集合,是一个LIFO(Last In, First Out。后进先出)的栈,一个back stack(可以通过back键弹出top activity)。



要点:

1、不管Task A中的activity A是新建一个task还是在自己的task中启动activity B,在activity B中按返回键返回的始终是B前面一个activity A(如果A还存在的话),只有一种情况例外,activity B声明了launchMode为signalTask,如果这个时候后台任务中已经有一个Task B包含B,在B中按返回键将返回Task B中activity B的前面一个activity。下面这个图是典型的实例:


diagram_backstack_singletask_multiactivity

2、程序员可以通过下面两种方式来管理task。

  1)在AndroidManifest.xml文件的activity属性中定义launchMode.

    "standard"

    默认的模式,系统会在启动这个activity的task中创建一个实例并把Intent传递给这个activity。这个activity可以被创建多次,各个实例可以存在与不同的task中,一个task也可以存在多个该activity实例。

    "singleTop"

    如果这个activity已经存在于当前任务并且是top activity,则系统不会另外创建一个实例(如果是standard模式则会另外创建一个),而是将Intent通过onNewIntent传递给这个实例。这个activity也可以被创建多次,各个实例可以存在与不同的task中,一个task同样可以存在多个这个activity的实例,前提是已经存在的activity不是当前任务的top activity。

    "singleTask"

    系统总是会创建一个新的task,并将这个activity初始化为这个新task的root activity。但是如果已经有另外一个task存在这个activity的实例,系统则不会另外创建,而是通过调用onNewIntent将intent传递给这个activity,任何时候都只有一个该activity的实例存在。(问题:这个时候如果这个activity不是top activity,在这个实例之上的其他activity如何处理?只是简单的将这个activity resume吗?"Note: Although the activity starts in a new task, the BACK key still returns the user to the previous activity.",从这个note看似乎是这样的,需要测试一下。

    singleTask的意思应该是任何时候只有一个task存在这个activity的实例。

    "singleInstance"

    与single类似,只有一点不同,系统不会引入任何其他activity到包含这个activity的task中,也就是说,singleInstance的意思是,这个activity是它所在的task的唯一成员,它启动的任何activity都会在其他task中打开。

  2)调用startActivity时传入相应的Intent flag。

    "FLAG_ACTIVITY_NEW_TASK"

    行为与singleTask一样。

    "FLAG_ACTIVITY_SINGLE_TOP"

    行为与singleTop一样。

    "FLAG_ACTIVITY_CLEAR_TOP"

    单独使用这个flag时,只在这个activity存在与当前task时起作用,如果这个activity不是top activity,会清掉它上面的所有activity,resume该activity,并且通过onNewIntent传入intent。

    这个flag通常和FLAG_ACTIVITY_NEW_TASK一起使用,这时候就会找到后台中存在这个activity的task并且把他放到可以处理这个intent的状态中(清掉它上面的activity)

3、任何activity在收到新的Intent之前都会先被暂停,因此这之后onResume总会被调用到,引用至onNewItem.

4、从eg702t stk和utk的表现来看,即使一个activity已经自杀了(某个时候自己调用finish),也会被am当作仍然存在于task中,因此不再重新创建这个activity,有可能会直接调用onNewIntent,明天去试试。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值