Activity的栈&&四种启动模式

导语

我们知道,手机系统上一般会打开多个app,而每个app又会有多个activity,那么如何管理这些activity就成了一个问题。

这篇博客就先介绍如何管理activity,再介绍activity的四种启动模式(以及不同启动模式下,如何管理activity以及如何实现跳转)。

Android系统如何管理activity

ActivityManagerService,AMS

AMS是系统在开机启动时所启动的一个独立的进程。一个系统只有一个AMS,与app之间通过IPC机制进行跨进程通信。

Process

系统默认为每个app提供一个process进程资源(但是也可以申请多个)。
在这里插入图片描述

ActivityStack

ActivityStack是AMS管理Activity实例的栈,也是只有一个。它管理协调ActivityRecord和TaskRecord以及所有的任务栈。

ActivityTask

ActivityTask是任务栈。不同于ActivityStack只能有一个,ActivityTask可以有多个。系统中所有的activity在面向用户时可能分成多个组,就是按照task来组织的。

它也叫BackStack回退栈,在一个Task栈里一直按Back键,就会不断回退到上一个Activity(包括其他App的Activity),直到回退至Home,所以,用户感知到的Activity界面回退逻辑,是由Task栈决定的,管理Activity的回退跳转逻辑,其实就是管理Task任务栈。

四种启动模式

启动模式是针对于ActivityTask来说的,而并不是ActivityStack。

它主要指明了一个activity的实例是否可复用以及如何复用。

启动模式可以在manifest文件中定义,也可以在intent中用代码动态赋值(例如添加FLAG_ACTIVITY_SINGLE_TOP标识,等同于设置singleTop属性),默认是standard。

standard

不复用。

当需要某个activity的实例时,不管之前是否创建过该activity的实例,直接创建一个新实例。

可能存在一个activity的多个实例。

singleTop

栈顶复用。

当需要某个activity的实例时,检查当前任务栈的栈顶是否是该activity的实例。
如果是,直接复用;否则,新建一个实例。

可能存在一个activity的多个实例。

singleTask

栈内复用

当需要某个activity的实例时,检查当前任务栈中是否存在该activity的实例。
如果存在,则将其前面的activity出栈,然后复用;否则,新建一个实例。

只可能存在一个activity的一个实例。

singleInstance

单例模式

该activity的实例独享一个任务栈,且该activity只有这一个任务栈,只有这一个实例。

只可能存在一个activity的一个实例。

图解

在这里插入图片描述

activity复用的生命周期

正常启动一个activity实例,是onCreate->onStart->onResume->… …
而复用一个已存在的activity实例,是onNewIntent->onRestart->onStart-> onResume->… …

更多关于activity生命周期的问题,可以参考Activity的生命周期详解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值