Activity

2021-02-24  本文已影响0人  eagerabu

一,初识
由于Android系统资源的有限性以及不同场景需求的不同,Android四大组件可以对应不同的使用场景从而提高系统资源的利用率,同时四大组件分工明确,共同构成了可重用、灵活、低耦合的安卓系统。四大组件必须在AndroidManifest文件中进行注册才能使用,接下来说一下四大组件分别是什么以及他们的使用场景。

二,Activity详细介绍

1, Activity生命周期

Activity是具有生命周期的,在生命周期的不同阶段可以进行处理不同的工作和任务,接下来通过Google官方提供图示来学习。 image.png

由图可以清楚的看到Activity在不同的情况下会走不同的生命周期,常见的生命周期有哪些呢?

2,任务任务栈
任务:用户在执行某项任务时与之交互的一系列Activity集合
返回栈:执行某项任务时用到的Activity会按照打开的顺序排列在一个返回堆栈中,当用户一直按返回按钮,Activity会从堆栈中按照后进先出的顺序退出知道返回主屏幕。移除堆栈中的所有Activity后,该任务将不复存在。

任务是一个整体单元,当用户开始一个新的任务或者通过主屏幕按钮进入主屏幕时,任务可移至后台,当前任务失去焦点,举例来说,假设当前任务(任务 A)的堆栈中有 3 个 Activity,当前 Activity 下有 2 个 Activity。用户按主屏幕按钮,然后从应用启动器中启动新应用。主屏幕出现后,任务 A 转到后台。当新应用启动时,系统会启动该应用的任务(任务 B),该任务具有自己的 Activity 堆栈。与该应用互动后,用户再次返回到主屏幕并选择最初启动任务 A 的应用。现在,任务 A 进入前台,其堆栈中的所有三个 Activity 都完好如初,堆栈顶部的 Activity 恢复运行。此时,用户仍可通过以下方式切换到任务 B:转到主屏幕并选择启动该任务的应用图标。

思考一个问题,Android管理任务和返回栈的方式是将所有接连启动的Activity放到同一任务和一个“后进先出”堆栈中,大多数应用页面的跳转都符合这种情况,但有些场景这种方式却不太适合,比如一个新闻列表页面,点击某个条目会进入详情显示页面,但有时点击没反应会多点击几次这样会导致详情页面打开多个,返回栈中存在了多个相同的详情页Activity,这个时候当我们点击退出时需要点击关闭详情页多次。再例如我们可能在多个应用中需要获取验证码,如果使用目前的管理模式短信详情页会被打开多次,使用特别混乱,因此就需要我们对任务和任务栈进行管理,这就用到了Android提供的启动模式。

3,启动模式
Android的启动模式可以指定Activity的启动方式,Activity启动模式有四种分别为"standard"(默认模式),"singleTop","singleTask","singleInstance“。

standard:
每次启动Activity都会创建新的Activity实例,无论所在回退栈里是否已经存在,每个实例可以属于不同任务,一个任务也可以有多个实例。
singleTop:
栈顶复用模式,如果要启动的Activity已经存在当前回退栈栈顶,则会直接利用已有的Activity而不会再重新创建新的Activity实例。
singleTask:
栈内复用模式,如果要启动的Activity已经存在于回退栈中,无论它是否在栈顶都不会重新创建新实例,启动此Activity会弹出此Activity之上的所有其他Activity从而使此Activity位于回退栈栈顶,直接使用。
singleInstance:
单例复用模式,使用了此模式的Activity单独使用一个回退栈,此Activity启动的其他Activity不会包含在此回退栈。

指定Activity以那种模式启动有两种方式:通过Intent标记和清单文件中使用 <activity>元素的 launchMode属性指定

launchMode属性指定:直接将launchMode值设置为standard或singleTop或singleTask或singleInstance
Intent标记:启动 Activity 时,您可以在传送给 startActivity() 的 intent 中添加相应的标记来修改 Activity 与其任务的默认关联,intent标记包含FLAG_ACTIVITY_NEW_TASK,FLAG_ACTIVITY_SINGLE_TOP,FLAG_ACTIVITY_CLEAR_TOP
三种。
FLAG_ACTIVITY_NEW_TASK:效果相当于singleTask。
FLAG_ACTIVITY_SINGLE_TOP:效果相当于singleTop。
FLAG_ACTIVITY_CLEAR_TOP:如果要启动的 Activity 已经在当前任务中运行,则不会启动该 Activity 的新实例,而是会销毁位于它之上的所有其他 Activity,并通过onNewIntent()将此 intent 传送给它的已恢复实例(现在位于堆栈顶部)launchMode 属性没有可产生此行为的值。

清除返回堆栈

如果用户离开任务较长时间,系统会清除任务中除根 Activity 以外的所有 Activity。当用户再次返回到该任务时,只有根 Activity 会恢复。系统之所以采取这种行为方式是因为,经过一段时间后,用户可能已经放弃了之前执行的操作,现在返回任务是为了开始某项新的操作。

您可以使用一些 Activity 属性来修改此行为:
alwaysRetainTaskState:如果在任务的根 Activity 中将该属性设为 "true",则不会发生上述默认行为。即使经过很长一段时间后,任务仍会在其堆栈中保留所有 Activity。

clearTaskOnLaunch:如果在任务的根 Activity 中将该属性设为 "true",那么只要用户离开任务再返回,堆栈就会被清除到只剩根 Activity。也就是说,它与 alwaysRetainTaskState正好相反。用户始终会返回到任务的初始状态,即便只是短暂离开任务也是如此。

finishOnTaskLaunch:该属性与 clearTaskOnLaunch类似,但它只会作用于单个 Activity 而非整个任务。它还可导致任何 Activity 消失,包括根 Activity。如果将该属性设为 "true",则 Activity 仅在当前会话中归属于任务。如果用户离开任务再返回,则该任务将不再存在。

4,进程和生命周期
Android系统为了在系统内存不足的时候应该终止那些进程,Android会根据每个进程中运行的组件以及组件状态,将他们放入”重要性层次结构“,这些层次结构包含以下五种。

前台进程:当前正在与用户交互的Activity所在的进程
可见进程:Activity可见但没有在前台所在的进程
服务进程:Activity在后台开启了Service服务所在的进程
后台进程:Activity完全处于后台所在的进程
空进程:没有任何Activity存在的进程优先级最低

系统内存资源不足是回收顺序为:空进程->后台进程->服务进程->可见进程->前台进程。

上一篇下一篇

猜你喜欢

热点阅读