Activity生命周期

参考:
https://blog.csdn.net/Android_Tutor/article/details/5772285
https://www.jianshu.com/p/31c023215867
https://www.jianshu.com/p/56ea25fbe5cf
https://www.jianshu.com/p/fb44584daee3
https://blog.csdn.net/javazejian/article/details/51932554
https://www.jianshu.com/p/fd063ff49745
https://blog.csdn.net/woshizisezise/article/details/53303832
https://juejin.im/post/5a9eaf2d518825558b3d700e
https://www.jianshu.com/p/d4dbe4a4528b

利用上次课上的测验。两个activity分别是主activity和activity2
主acitivity界面有一个登录按钮
另activity2界面有一个返回按钮
点击登录按钮后,由主activity界面进入activity2界面。
点击返回按钮后,由acitivity2进入主activity界面。

开始测试:

在手机中打开主activity界面
onCreate->onStart->onResume
在这里插入图片描述
在这里插入图片描述

不对主acitivity界面进行操作,30s后,手机锁屏
onPause->onStop
在这里插入图片描述

解锁,自动进入主activity界面
onRestart->onStart->onResume
在这里插入图片描述

按home键
onPause->onStop
在这里插入图片描述
按home键, 再进入该app
onRestart->onStart->onResume
在这里插入图片描述
关掉该app
onDestroy
在这里插入图片描述
在主activity界面点击登录,进入activity2界面
onPause1->onCreate2->onStart2->onResume2->onStop1
在这里插入图片描述
在这里插入图片描述

在activity2界面,点击返回,返回主activity界面
onPause2->onRestart1->onStart1->onResume1->onStop2->onDestory2
在这里插入图片描述

Activity生命周期图
在这里插入图片描述

开启主活动1并切换到活动2
在这里插入图片描述

返回栈:android使用任务来管理活动,一个任务就是一组存放在栈里的活动的集合。这个栈就是返回栈。
先进后出。存放activity的集合,每启动一个activity,其都会进入返回栈的栈顶(获得焦点)。只有身处在返回栈,同时处于栈顶/前台/foreground的activity才能获得焦点,被用户看到,与用户发生交互。
即处于栈顶且获得焦点的活动才能与用户发生交互。onPause()之后onResume2()之前,处于栈顶/前台,此时没有可与用户交互的活动。
在这里插入图片描述

完整生存期:调用onCreate()----调用onDestroy()之间的时间段。

可见生存期:调用onStart()----调用onStop()之间的时间段。在可见生存期内,Activity 是可见的,即使该 Activity 不在前台和无法与用户交互。

前台生存期:调用onResume()-----调用onPause()之间的时间段。在前台生存期内,即处于栈顶,activity处于运行状态,位于屏幕上所有activity之上,能与用户进行交互。

打开activity,再打开ctivity2调用过程:activity刚创建(调用onCreate())时,处于不可见状态,要调用onStart()使activity变得可见,随后调用onResume使ativity处于栈顶,获得焦点(可与用户交互),当开启activity2时候,先使当前activity调用onPause()失去焦点(此时activity还处于栈顶),然后对activity2进行操作,创建、使可见、使处于栈顶(此时activity2处于栈顶,activity在栈底),activity2获得焦点,对activity调用onStop(),使其不可见。此时返回栈情况:activity2在栈顶,activity在栈底。

焦点:当前光标被激活的位置。用于接收输入的图形用户界面的组件,文本中的游标,鼠标。

获得焦点:即该activity可以和用户进行交互。在activity处于返回栈栈顶时,存在两种状态:一是获得焦点,可与用户交互(调用onResume()之后-----调用onPause()之前);二是丧失焦点,不能与用户交互(调用onPause()之后------新的activity调用onResume()之前)。

后台activity:
没有获得焦点的activity。分为在栈顶和不在栈顶。在栈顶必然可见,不在栈顶有可以分为两个情况:可见和不可见。
在栈顶(必然可见)的后台activity:处于这个状态的时间很短。activity1调用onPause()之后到actvitity2调用onResume2()之前。Activity1在栈顶,但是失去了焦点(不再是前台服务器),属于后台activity。
不在栈顶的可见状态的后台activity:activit2调用了onResume(),activity2获得了焦点,此时activity在返回栈的栈底,由于activity2非全屏,activity1此时可见,没有调用activity的onStop()。
在这里插入图片描述

不在栈顶的不可见状态的后台activity。即调用onStart()之前(没进入返回栈)和调用onStop()之后(此时activity没有被销毁且不在栈顶,在返回栈栈中或栈底)。

前台activity:
获得焦点的activity。栈顶是(前台/获得焦点/可与用户交互)的基础。

栈顶≠(前台=获得焦点=可与用户交互)。栈顶只是前台/获得焦点的基础。在栈顶有可能没有焦点:这段时间很短。如: onPause()之后onResume2()之前,处于栈顶,当前活动1失去了焦点,而活动2还没有进入栈顶获得焦点,此时没有可与用户交互的活动。

分析各种方法的调用时机。
onCreate():
第一次被创建的时候调用。创建activity,setContentView()加载布局资源,初始化activity所需数据。
onStart():
在想让activity由不可见变为可见的时候调用。启动activity,使其可见。但是由于还没有进入返回栈的栈顶/最上面,所以不能让我们看到。可以理解为,acitivity已显示,但用户还不能看到。
onResume():
在想让activity和用户交互的时候调用。获得焦点。使activity进入返回栈,并处于栈顶(每个进入的actvitity都是处于栈顶,因为先进后出),此时该activity获得焦点,处于活动状态,可以被用户看到(栈的最上面),并与之进行交互。
主要是为了获得焦点。但因为必须要处于返回栈栈顶才能获得焦点,所以有一系列入栈的操作。
与onPause()对应,onPause()是使得失去焦点,而不是使其不处于栈顶。该活动不处于栈顶是随着新活动的onResume()的调用而产生的。新活动入栈,老活动就不再占据栈顶。
onPause():
在系统跳到另一个activity或应用退出的时候调用。使activity失去焦点,不可与用户交互,处于暂停的状态(一般随后就会调用onStop(),进入不可见状态,但是当新开启的活动是非全屏或透明的,此时就不会调用onStop(),此时该活动处于可见),做一些资源回收,如动画暂停。该方法执行之后,下一个activity才能被执行。
主要是使失去焦点。
onRestart():
恢复活动时调用。
OnStop():
在想让activity不再可见时被调用(新开启的activity2获得焦点之后)。使活动不可见(进入后台:不在栈顶)。此时activity对象还在内存中,没有被销毁。
onDestroy():销毁activity的时候调用。摧毁activity,释放内存。

一些问题
1、为什么切换activity时候,执行次序是onPause1()->onCreate2()->onStart2()->onResume2()->onStop1()?
因为activity在onPause()之后,会释放掉很多系统资源,可以在切换activity时提供流畅的保证,而不在onStop1()之后执行onCreate1()是为了让切换更快的进行。
2、onCreate()和onStart()方法区别:前者不可见,后者可见。onCreate()在生命周期中,只执行一次,onStart()可执行多次。
3、onStart()和onResume()方法区别:是否在前台/获得焦点。
4、onPause()和onStop()方法区别:是否可见。
5、onStop()和onDestory()方法区别:是否销毁在内存中的对象。
6、onResume()和onPause()对应,一为获得焦点,一为失去焦点。
onResume主要为获得焦点,使activity处于栈顶,只是顺手为之。
7、onStart()和onStop()对应,一为使可见,一为使不可见。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值