如何更好地理解Activity生命周期
Activity 生命周期是我们最常见的东西,刚开始学 Android 的时候往往都是在 Activity 的 onCreate() 方法里做一些工作,但是为什么在这里面做呢?其他方法是干嘛的呢?刚开始学习的时候往往不够深入去理解这些知识。下面就通过我学习的过程做的一些笔记,希望对我们能够有所帮助。
- 官方 Activity 生命周期的解释
- 通俗 Activity 生命周期的解释
- onStart() 和 onResume() 的区别(onPause() 与 onStop())
- onCreate() 和 onRestart() 的区别
- 正常与异常情况下的 Activity 生命周期
官方 Activity 生命周期的解释
如图片所示,大家都会在各大博客和书籍上都看过,并且讲的很详细,这里就不再重复啦。其中一个传送门
通俗 Activity 生命周期的解释
但是每一步每一个方法是干嘛的呢?我们现在来按顺序说说。
- onCreate()
它的构造函数可以抽象成下面这样
onCreate()
{
createNecessaryObjects();//创建必要的对象
prepareObjectsForDisplay();//准备显示
}
是不是有点明白了?其实它做的工作就是创建对象和准备的工作,所以一些初始化的工作都会在onCreate()的方法里面完成。
- onStart()
这时候Activity 正在启动,我们通常看到书上和博博客上看到别人用“可见”这个状态来描述这时候的Activity ,但是“可见”怎么理解呢?我举个例子,比如一个叫隔壁老王的人站在你前面,但是他前面有个毛玻璃,你只能透过毛玻璃看到他,这就是“可见”的状态。(这时候你想打他的时候还打不到他,为什么说要打他呢?看到下面你就会知道)
对应我们的安卓系统,在app上有一个窗口弹出来,但是app的界面除了窗口遮挡的部分你是可以看到它的,就在这个窗口下面,不过这时候你却不能操控app界面了,只可以操控弹出来的窗口是不是?这时候那个app界面就是处于“可见”状态。而那个窗口就相当于上面的毛玻璃。
在这个阶段呢,Activity 处于“可见”状态,只不过还没显示到我们的手机屏幕上。
- onResume()
这个阶段 Activity “可见”并且已经处于我们的手机屏幕上了,这时候就可以可 Activity 进行交互了。就相当于隔壁老王前面那块毛玻璃已经被拿走了,你可以和他进行交互(打他)了。
到此为止,一个新的 Activity 就被创建并且显示在我们的手机屏幕上,我们可以和它愉快的进行玩耍了。
- onPause()
这时候的 Activity 正在被停止。这时候已经不能够和 Activity 进行交互了,可以理解为隔壁老王前面那块毛玻璃又加上去了,你之前没打他现在就不能打了,但是任然“可见”。除了别的书籍和博客介绍的,有个值得注意的地方是此 Activity 的 onPause() 方法执行完之后,新 Activity 的onReasum() 方法才会执行,所以为了用户体验,不应该在 onPause() 方法里面执行一些太耗时的工作,不然新的 Activity 迟迟没显示出来用户就再也不用这个软件啦。
- onStop()
这时 Activity 即将停止了,已经变得“不可见”了。隔壁老王已经被你打的半死不活了,送走了···
- onDestroy()
Activity 即将被销毁掉了。然后 Activity 就被关闭掉了。
所以,上面那张图对应理解过来就是如下图所示了:
这样子能理解每个方法的不同之处在哪里了吗?
onStart() 和 onResume() 的区别
经过上面的介绍,onStart() 和 onResume() 的区别就是他们之间一个用户可以与 Activity 进行交互而另外一个却不能。
onCreate() 和 onRestart() 的区别
你们会不会好奇为什么来个 onCreate() 就好了,还要再多一个 onRestart() 呢?他们的区别是什么?为什么还要 onRestart() 再到 onStart() 呢?
我么你其实可以把onRestart()的构造函数看成是这样:
onRestart()
{
prepareObjectsForDisplay();//准备显示
}
和上面给出的 onCreate() 的抽象构造函数有什么区别?对,就是少了个 createNecessaryObjects() 的函数,就是说我们在 onStart() 之前呢,还是需要进行一些准备显示的工作的。但是呢,由于 onCreate() 已经帮我们做了一些初始化的工作的,我们就不需要再去做了。
正常与异常情况下的 Activity 生命周期
- 正常
第一次调用:onCreate() -> onStart() -> onResume()
回到桌面&打开新的 Activity :onPause() -> onStop() (注意这时候原 Activity onPause() 之后新 Activity 才 onResume())
按下back键:onPause() -> onStop() -> onDestory()
屏幕横竖变换: onPause() -> onStop() -> onDestory() -> onCreate() -> onStart() -> onResume()
- 异常
异常情况下我们可以重写
onSaveInstanceState()
onRestoreInstanceState()
来进行保存信息,其实屏幕横竖变换也算是属于异常情况下的一种。
屏幕横竖变换: onPause() -> onSaveInstanceState() -> onStop() -> onDestory() -> onCreate() -> onStart() -> onRestoreInstanceState()-> onResume()
在保存信息方面虽说是 Activity 调用 onSaveInstanceState()&onRestoreInstanceState() 方法进行信息保存,实际上是 Activity 会委托 Window 去保存数据,Window 再委托上面的容器去保存数据,容器再委托子View去保存数据。
新手第一篇文章,有不足错误之处还望大家指正,多多交流~
参考:
stackoverflow:http://stackoverflow.com/questions/4553605/difference-between-onstart-and-onresume
Android开发艺术探索-任玉刚