在讲活动的生命周期之前首先需要了解
“返回栈”
的概念。Android中的活动是可以层叠的,每当启动一个新的活动,就会覆盖在原活动之上,然后点击Back就会销毁最上面的活动,下面被覆盖的活动就会重新显示出来。这里就引出了“
返回栈
”的概念,在Android中使用任务来管理活动,一个任务就是一组存放在栈里面的活动的合集,这个栈就是返回栈。栈是一种先进后出的数据结构,每当启动一个新活动,这个活动就会入栈,并处于栈顶位置,而每当按下Back键或者调用finish()方法就会销毁掉这个活动,这个活动就会出栈,先前被覆盖的活动就会重新处于栈顶位置。我们在使用APP时,显示在屏幕上的活动总是处于栈顶的活动。
跟活动生命周期有关的方法有七个,分别为:1.onCreate() 2.onStart() 3.onResume() 4.onPause() 5.onStop() 6.onDestroy() 7.onRestart(),这七个方法除了onRestart() 外都是两两对应的,因此可分为3种生存期,分别为:
- 完整生存期:onCreate()—onDestroy() 这个周期代表一个活动完整的生命周期,从创建活动开始到销毁活动结束。
- 可见生存期:onStart()—onStop() 这个周期代表可见周期,处在这个周期的活动是可以在屏幕上可见的,但是不一定能够和用户进行交互。
- 前台生存期:onResume()—onPause() 这个周期代表交互周期,处在这个周期的活动一定是位于栈顶的活动,是可以在屏幕上可见的并且能够和用户进行交互的。
举个例子,当我们在手机上登录账号时,会弹出一个输入账号密码的页面,这时候输入账号密码的页面就处在前台生存期,我们能够看到它并且能和它进行交互,而登录界面从前台生存期转到了可见生存期,我们仍然能够看到它,但是并不能和它进行交互,登录界面上的所有按钮无法点击。若我们输入密码错误,界面返回到登录界面,这时候登录界面又重新返回到了前台生存期,我们又可以继续进行登录操作。
当启动一个活动时,首先调用的是onCreate()方法,在这个方法里面会完成活动的初始化操作;之后调用onStart()方法,表示活动从不可见状态变为可见状态;之后再调用onResume()方法,表示活动已经准备好和用户进行交互了(此时活动一定位于栈顶,因为处于栈顶的活动才能进行交互);这时如果有一个新的活动加入栈并处于栈顶(比如输入账号密码界面),分两种情况考虑:1。被覆盖的活动仍可见,此时调用onPause()方法,当活动重新返回栈顶时,调用onResume()方法唤醒活动。2.被覆盖的活动不可见,此时调用onStop()方法,当活动重新返回栈顶时,需要先调用onRestart()方法再调用onStart()方法唤醒活动;最后活动被销毁时调用onDestroy()方法。
另外需要注意的是,当活动处于不可见状态调用了onStop()方法之后,有可能因内存不足等原因被系统回收,这时候再重新返回到这个活动时调用的是onCreate()方法将重新创建一次。这时会存在一种情况,当重新返回到该活动时,活动上的临时数据都会被清除,用户又得重新输入数据,那么如何解决这个问题呢?系统提供了一个onSaveInstanceState()方法,该方法会在活动被注销时自动调用。此方法有一个Bundle类型的参数,Bundle提供了一系列的方法保存数据,我们只需要在活动中重写该方法即可。数据保存下来之后怎么进行恢复操作呢???这时候你会发现onCreate()方法里面也有一个Bundle参数,这个参数一般情况都是null,但是如果活动被系统回收前调用过onSaveInstanceState()方法保存数据的话,这个参数就会带有之前保存的全部数据了。