开发艺术之旅 | Activity 生命周期和启动模式

本文深入剖析了Android中Activity的生命周期,包括onCreate、onStart、onResume等关键方法的作用及调用时机,阐述了Activity在不同状态下的行为差异,以及如何在资源变化或内存不足时妥善处理Activity的状态。

生命周期

生命周期状态工作
onCreateActivity正在被创建可以做一些初始化工作
onRestartActivity从不可见重新变成可见
onStartActivity正在被启动,“可见”但不在前台
onResumeActivity可见并且出现在前台,可交互
onPauseActivity正在停止,接下来一般会调用onStop存储工作、停止动画,非耗时操作
onStopActivity即将停止稍微重量级的回收操作,不能太耗时
onDestroy即将被销毁回收对象,释放资源

几种情况

  • 打开新的Activity或者回到桌面 onPause -> onStop
  • 回到原Activity onRestart -> onStart -> onResume
  • 按back键回退 onPause -> onStop -> onDestroy
  • 打开新的活动:旧的活动先执行 onPause方法,新的活动才会启动,执行顺序:onPause -> onCreate -> onStart -> onResume -> (First Activity) onStop 所以不能再onPause执行耗时操作,需要让新的Activity尽快显示出来

成对的生命周期

  • 从整个生命周期来看:onCreate 和 onDestroy 标注Activity的创建和销毁
  • 从Activity是否可见来看:onStart 和 onStop 可能会被调用多次
  • 从Activity是否在前台:onResume 和 onPause

onStart和onResume、onPause 和 onStop 的区别

角度不同 如上;实际使用无明显区别

异常情况下生命周期分析

  • onSaveInstanceState() :存储数据 在 onStop 方法之前调用
  • onRestoreInstanceState() :恢复数据 在onStart 方法之后调用
情况一:资源相关的系统配置发生改变

默认情况下Activity会被销毁并重新创建
onSaveInstanceState -> onDestroy/onCreate(new) -> onRestoreInstanceState

系统帮我们做了一定的恢复工作,例如文本框输入的数据、滑动位置等和View相关的状态

  • onRestoreInstanceState:Activity被销毁并且重新创建才会调用 里面的Bundle一定不为空

委托思想
每个view都有上述两个方法

  1. Activity -> onSaveInstanceState 保存数据
  2. Activity 委托 Window保存数据
  3. Window 委屈上面的顶级容器保存数据(Viewgroup,一般来说是DecorView)
  4. 顶层容器一一通知它的子元素保存数据
情况二:资源内存不足导致低优先级的Activity被杀死

优先级:

  1. 前台Activity
  2. 可见但非前台的Activity——例如打开了一个Dialog
  3. 后台Activity——已经被暂停的Activity,执行力onStop

如何在系统配置改变时不重新创建Activity?

AndroidMainifest中,activity标签有个字段:configChanges 可以定义,指定多个标签用“|”连接。

常用标签:
  • locale: 设备的本地位置发生了改变,一般为切换了系统语言
  • orientation: 屏幕方向发生了改变
  • keyboardHidden: 键盘的可访问性发生了改变,例如用户调出了键盘
需要注意的标签:
  • screenSize: 屏幕的尺寸信息发生了改变
  • smallestScreenSize: 设备的物理尺寸发生改变,例如切换了外部显示设备

当这两个标签在API小于13时,此选项不会导致Activity重启,否则会;因此在常用防止Activity进行重启需加入:

android:configChanges="orientation|screenSize"

加入后改变屏幕的方向就不会Activity就不会重启了

Activity的启动模式

  • standard
  • singleTop
  • singleTask
  • singleInstance
standard

标准模式,每次都会创建一个新的实例,并进入启动它的Activity的栈中;如果是由非Activity的context启动的(例如ApplicationContext),其并没有任务栈,因此会报错误,所以需要加上FLAG_ACTIVITY_NEW_TASK标记位,此时Activity实际上是以singleTask模式启动的

singleTop

栈顶复用,如果已经处于任务栈的栈顶,就不会重新创建这个Activity,而是会回调onNewIntent()方法【不会调用onCreate、onStart方法】

singleTask

栈内复用
如果在目标任务栈中存在Activity的实例,则不会创建一个新的Activity,而是将这个实例移到栈顶并将上面所有的Activity出栈,并回调onNewIntent()方法【不会调用onCreate、onStart方法】;

  • 如果目标任务栈不存在(跨应用调用),会先创建目标栈
  • 在目标任务栈中寻找实例,如果不存在,则创建实例并压入栈中,如果存在,则调到栈顶

参考,官翻

singleInstance

单实例模式
具有singleTask所有的特性,但是只能位于一个单独的任务栈中,后续调用都会启动这个栈中实例,除非任务栈被销毁

Activity的Flag

可以通过设定Flag设定启动模式,常见的几个Flag:

  • FLAG_ACTIVITY_NEW_TASK 指定为singleTask模式
  • FLAG_ACTIVITY_CLEAR_TOP 清空同一个任务栈中所有的Activity,一般配合NEW_TASK 一起使用
  • FLAG_ACTIVITY_SINGLE_TOP 指定为single_top模式
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 不会出现在历史Activity的列表中

隐式启动Activity(IntentFilter)

隐式启动必须匹配过滤列表中所有的种类,一个Activity可以有多组IntentFilter

  • action 字符串,区分大小写,如果有多个,只要匹配其中一个就可以
  • category 字符串,可以不指定,但是指定了就必须能匹配到,才能启动
  • data 由 mimeType 和 URI组成;mimeType 指媒体类型(image/jpeg、audio/mpeg4-generic、video/*)匹配时通过intent.setDataAndType(Uri data, String type)方法对date进行设置。

End

关于View 的工作原理:开发艺术之旅 | View的工作原理

Nano-ESG数据资源库的构建基于2023年初至2024年秋季期间采集的逾84万条新闻文本,从中系统提炼出企业环境、社会及治理维度的信息。其构建流程首先依据特定术语在德语与英语新闻平台上检索,初步锁定与德国DAX 40成分股企业相关联的报道。随后借助嵌入技术对文本段落执行去重操作,以降低内容冗余。继而采用GLiNER这一跨语言零样本实体识别系统,排除与目标企业无关的文档。在此基础上,通过GPT-3.5与GPT-4o等大规模语言模型对文本进行双重筛选:一方面判定其与ESG议题的相关性,另一方面生成简明的内容概要。最终环节由GPT-4o模型完成,它对每篇文献进行ESG情感倾向(正面、中性或负面)的判定,并标注所涉及的ESG具体维度,从而形成具备时序特征的ESG情感与维度标注数据集。 该数据集适用于多类企业可持续性研究,例如ESG情感趋势分析、ESG维度细分类别研究,以及企业可持续性事件的时序演变追踪。研究者可利用数据集内提供的新闻摘要、情感标签与维度分类,深入考察企业在不同时期的环境、社会及治理表现。此外,借助Bertopic等主题建模方法,能够从数据中识别出与企业相关的核心ESG议题,并观察这些议题随时间的演进轨迹。该资源以其开放获取特性与连续的时间覆盖,为探究企业可持续性表现的动态变化提供了系统化的数据基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值