Android四大组件之Activity详解

来源:互联网 发布:超次元矩阵官网 编辑:程序博客网 时间:2024/06/05 06:26

一提到四大组件首先想起的就是Activity,现在就好好把Activity好好总结一下,以便以后忘记时查阅。想到Activity 首先就是Android的生命周期,脑海中自然就想到了文章底部下面的那张Activity生命周期图。

首先来说说Activity的生命周期:

1.一个完整的生命周期(entire lifetime):

onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy;

2.可见的生命周期(visible lifttime):

onstart -> onResume ->onpause ;

需要说明的是,在onstop之前用户都能看到activity

3.前台的生命周期(foreground lifetime):onResume->onpause

此阶段在onResume方法之后,在执行onpause方法执行之前,在此阶段Activity能够响应用户交互。


现在来说说每个声明周期方法的特点:

当执行到oncreate方法时创建activity,这时用户是看不见activity的,oncreate方法主要是执行的是一些资源的初始化,包括一些控件,类的初始化等。

当执行onstart()方法后用户才能正真看到屏幕上的activity,但是还不能与用户交互(点击事件或者滑动事件没有任何效果)。

当执行到onresume我们称之为获取焦点,特点就是可以相应用户的交互。

当执行onpasue方法之后,acitivity失去焦点,我们还是能看到activity,但是屏幕会变暗.

当执行onstop时候,activity无法被用户可见。此时activit也还没有被销毁,因此该activity还在任务栈中,如果想在再次显示时会执行restart()方法,一般此方法在用户点击home键,然后再打开应用时会执行restart()方法。

当执行ondestory时,activity会被销毁,释放资源,activity弹出任务栈。


现在我们来了解在几个场景下activity的生命周期的方法调用顺序

场景一:当从A 活动跳转到B 活动时

首先 启动A执行:A:onCreate -> A:onStart -> A:onResume。

然后跳转到B依次执行:A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop。

此时如果点击,将依次执行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy。

此时任务栈中只存在A活动,在此情况下,我们点击back或者home键会执行不同的生命周期方法;

如果点击back键,A活动会返回到桌面,A活动会被销毁执行A:onPause -> A:onStop -> A:onDestroy。

如果点击home键,A活动会返回到桌面,但是A活动不会被销毁执行:A:onPause -> A:onStop。



相信Activityde 生命周期方法应该有所了解,但是还有个问题,当我们从一个activity启动另外一个activity时,这个activity存放在哪呢?现在我们了解下activity存放的容器,--Task

Task是一种栈结构的用来存放activity的容器,我姑且把它称为任务栈。

简单的说,当activity执行oncreate时activity被压入栈中,执行onDestory时候activity被弹出栈。

当我们创建一个activity时,系统会生成一个task,用来放置根Activvity,默认情况下当根Activity启动另一个activity时,前面的根activity被压入任务栈的底部,后面的acitivity方法放置在根任务栈的上面,当用户点击返回时activity会被销毁,activity就会被弹出栈,下面的activity就重新处于任务栈的顶部,然后被显示到屏幕上,系统task和task之间是互相独立的,当我们运行一个应用时,按下Home键回到主屏,启动另一个应用,这个过程中,之前的task被转移到后台,新的task被转移到前台,其根Activity也会显示到幕前,过了一会之后,在此按下Home键回到主屏,再选择之前的应用,之前的task会被转移到前台,系统仍然保留着task内的所有Activity实例,而那个新的task会被转移到后台,如果这时用户再做后退等动作,就是针对该task内部进行操作了。


说完了任务栈,我们再来 了解下Activity的四种启动模式:

standard:标准启动模式,每次启动activity会创建新的activity,然后将旧的压入任务栈中,将新的放入任务栈的顶部。

singleTop:在此模式启动activity时,首先会判断当前任务栈的栈顶是否存在该activity的实例,如果有则不再创建新的activity,复用栈顶的activity的实例,但是每次复用都会执行onNewIntent()方法。如果栈顶没有该activity的实例则创建新的activity。注意:一定要是栈顶存在该activity的实例才会被复用,其他情况回创建新activity。常见的情况是在当前activity再次启动当前的activity。当前的activity会被复用。

singleTask:此启动模式下,当启动activity时,首先会判断任务栈中是否存在该activity的实例(判断之前是否被启动过且未被销毁),如果存在则将activity 置于栈顶,原来栈中在此activity中的之上的activity会被弹出栈中,相当于被销毁。

singleInstance:在一个新任务栈中创建该Activity实例,并让多个应用共享该栈中的该Activity实例。该模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当 于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。  

    举个例子,该启动模式和我们使用的浏览器工作原理类似,我们都知道在多个程序中访问浏览器时,如果当前浏览器没有打开,则打开浏览器,否则会在当前打开的浏览器中访问。此模式会节省大量的系统资源,因为他能保证要请求的Activity对象在当前的栈中只存在一个。

-------------------------------------------------------------------------------------------------------------------------

好了,关于activity的总结就这些了。欢迎大家阅读,本人水平有限,如有错漏,欢迎指正。




0 0
原创粉丝点击