Android四大组件—Activity

1.Activity是什么?

       Activity是一种可以包含用户界面的组件,在我们使用APP的过程中主要就是和Activity进行交互,一个APP中可以包含零个或者多个Activity,但是不包含任何Activity的应用很少见,毕竟所有的APP开发者都不会让自己的辛辛苦苦写出来的应用这么没有存在感吧。Activity作为四大组件中使用频率最高的一个组件,做为开发者的我们来说。了解Activity的特点,工作方式等对于开发高质量的应用时十分有必要的。(PS:文章中所涉及的图片均来自Android开发者网站)

2.Android的任务栈

       任务栈是一个Activity的集合,一个APP通常要被拆分成多个Activity,而各个Activity之间又时通过Intent进行连接和传递数据的。对于Android系统而言,它会使用栈的结构来保存整个APP中的Activity,这个栈又被称为返回栈,栈中Activity的顺序就是按照它们被打开的顺序依次存放的。学过数据结构的朋友们都应该知道栈是一种后进先出的结构,栈底的元素就是第一个进栈的元素,通常也是整个任务栈的发起者。

       当一个APP启动时,若当前环境中没有该APP的任务栈,那么系统就会创建一个新的任务栈用来管理该APP所启动的Activity。在正常情况下当一个Activity启动了另一个Activity的时候,新启动的Activity就会置于任务栈的栈顶,并且处于活动状态,而启动它的Activity也会保留在任务栈中并且处于停止状态,当用户按下返回键或者调用finish()方法时,系统会将顶部的Activity出栈,让后面的Activity置于栈顶并且处于活动状态。


       该图显示出了任务栈中的每个新Activity如何向返回栈添加项目,当用户按下“返回”按钮时,当前的Activity出栈而前一个Activity恢复执行

3.Activity的生命周期

       在Android的开发者网站上Google给我们了一张流程图,通过这张流程图可以很方便的去了解Activity从产生到销毁的全过程,只有对Activity的习性足够了解,才能更好的控制Activity为我们服务。


       由图可知Activity的这一生中总个有7种状态,其中只有onResumed(),onPaused()和onStopped()这三个状态时稳定,而其他的状态都是过度状态,很快就会变成下一个状态。下来就来一一介绍这7种状态。

  • onCreate():这个状态相信大家一定不会陌生,因为建立每个Activity时都要重写这个方法,当Activity被创建的时候调用这个方法,通常我们会在这个方法种进行当前界面的初始化工作,比如设置布局,初始化控件,绑定监听事件等
  • onStart():当Activity需要由不可见变为可见的时候会调用这个方法,需要注意的是此时Activity还是处于不可见的状态
  • onResume():当Activity准备好需要和用户进行交互的时候调用这个方法,此时的Activity一定位于任务栈的栈顶,并且处于运行状态
  • onPause():当Activity失去焦点其中的控件不不能得到点击事件,并且被一个全新的非全屏的Activity遮挡时调用这个方法,此时的Activity只是暂时失去了与用户交互的能力,所有的信息还都被保存着,只有在系统内存极低的情况下才会被系统进行回收
  • onStop():当Activity被另一个全新的全屏的Activity完全覆盖,此时就会调用这个方法它变成为不可见的状态,但是却保存着所有的信息
  • onRestart():当Activity由停止状态变为运行状态需要调用此方法
  • onDestroy():当Activity被销毁的时候调用此方法,之后Activity的状态就变为销毁状态

4.管理任务栈

       Android系统管理任务栈的方式正像上面描述的一样,就是把一个APP中所启动的Activity都放入到一个相同的任务当中,通过栈的结构来进行管理。当然这种逻辑对于大多数的情况来说是没有问题的,做为开发者也无须关心此时的任务栈中是什么情况。但是,如果应用程序允许多个入口都可以启动同一个Activity,那么此时的任务栈中就会出现下图中的情况。


       每次启动的时候都会创建该Activity的一个新的实例,而不是将已有的Activity实例移动到栈顶,这样的话就是导致同一个Activity有可能被实例化很多次。但是,做为开发者的我们来说肯定不会希望同一个Activity被实例化很多次,这时我们就要通过给当前的Activity设置启动模式的方法来对任务栈中的Activity进行管理,启动模式一共有四种,分别是standard、singleTop、singleTask和singleInstance,可以在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式。

standard

—标准模式,standard是Activity默认的启动模式,即如果没有指定当前Activity的启动模式则系统默认使用标准模式, 在这种启动模式下,每当启动一个新的Activity时系统就会为该Activity创建一个新的实例,并置于栈顶的位置。对于使用standard模式的Activity来说,系统不会在乎这个活动是否已经在任务栈中,每次启动时就会创建该Activity的一个新的实例并置于栈顶的位置。

“singleTop”

—在某些情况下使用standard模式做为启动模式会有些不太合理,比如,此时活动已经在栈顶了,为什么再次启动该活动的时候还需要重新创建实例。此时就应该使用singleTop模式,当Activity的启动模式指定为singleTop时,在启动Activity时如果发现任务栈的栈顶已经是该Activity的实例了,则认为可以直接使用栈顶的实例,不会再创建一个新的Activity实例。

“singleTask”

—当被启动的Activity处于栈顶的位置时,通过使用singleTop模式可以很好的解决重复创建栈顶Activity的问题,但是该活动没有在栈顶的位置使用singleTop模式还是会创建多个Activity实例,此时就要通过使用singleTask模式来解决这个问题。当Activity的启动模式指定为singleTask时,每次启动该活动时系统首先会在任务栈中检查是否存在该Activity的实例,如果有则把这个Activity之上的所有Activity统统出栈,将该Activity置为栈顶的位置,如果没有就会创建一个新的Activity实例置于栈顶。

“singleInstance”

singleInstance模式应该是这四种启动模式中最复杂的一个,不同于以上的三种启动模式,当一个Activity被指定为singleInstance模式时,启动该Activity时系统会启动一个新的任务栈来管理这个Activity,并且系统不会向声明成“singleInstance”的Activity所在的任务栈中再添加其它的Activity,也就是说,这种启动模式下的Activity所在的任务栈中有且只会有一个Activity,通过Activity再启动其它的Activity则也会被放入到别的任务栈中。在这种启动模式下系统会有一个单独的任务栈来管理该Activity,不管是哪个应用程序来启动这个Activity都共用一个任务栈,也就解决了共享Activity实例的问题。

其实不管是Activity是在一个新任务栈中启动还是在当前任务栈中启动,返回键永远都会把我们带回前一个Activity中

5.清理返回栈

如果用户将APP切换到后台很长一段时间即将任务栈切换到后台很长一段时间,系统就会清除这个任务栈中除了最底层的Activity外的其它所有Activity,当用户再次返回这个任务栈时,系统仅仅恢复最底层的那个Activity实例,这个是系统默认的逻辑。系统这样做的原因是在经过很长一段时间后,用户很可能已经放弃之前执行的操作,此时返回任务栈是要开始新的操作,需要重新开始。如果要改变这种默认的逻辑可以通过在AndroidManifest.xml中通过给<activity>标签中设定指定的属性来改变。

“alwaysRetainTaskState”

—如果在任务栈的根Activity中将次属性设置为“true”,则不会发生系统默认的逻辑,即使任务栈切换到后台很长一段时间,任务栈仍然可以将所有的Activity保留在其堆栈中

“clearTaskOnLaunch”

如果在任务栈的根Activity中将次属性设置为“true”,则每当用户离开任务栈然后返回时,系统都会将堆栈清除到只剩下根Activity,即使用户只离开任务栈很短的时间,用户也始终会返回到任务的初始状态

“finishOnTaskLaunch”

如果在任务栈的根Activity中将次属性设置为“true”,则只要用户离开当前任务栈,再次返回该任务栈时这个Activity就会被清除掉。这个属性的作用类似于clearTaskOnLaunch,只不过clearTaskOnLaunch是作用于整个任务栈的,而finishOnTaskLaunch仅仅是作用于当前Activity的


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值