Android四大组件之一Activity及生命周期

前言
最近项目不是很忙。这对我来说是有点闹心的,因为总是一停下来就不知所措了。静下心来想想,做Android也1年多了,在这一年多里,感觉自己没什么成长,虽然能够完成工作任务,但久而久之对于一个想要在IT行业长期发展的程序员来说仅仅完成工作业务是远远不够的。那就需要我们不断去学习新的技术知识来充实和完善自己,之前也是在闲暇之余看过也学过的,但是学的没有忘的快。所以今天我想从基础知识入手把学过的在一一记录下来,在此基础之上在延伸学习和总结新的知识。好了,不扯那么多了,都是白话。。。
一、Activity简介
众所周知Activity是Android四大组件之一,译为活动,用来提供一个能让用户操作并与之交互的界面。
来看看源码是怎么解释Activity的?
在这里插入图片描述
一个界面是开发者可以操作的一个重点的独立事项。几乎所有界面都可以与用户交互,所以Activity类负责为用户创建一个窗口,你可以在其中使用setContentView(View)放置UI。虽然界面通常以全屏窗口的形式呈现给用户,但它们也可以以其他方式使用:作为浮动窗口(通过具有windowIsFloating集合的主题)或嵌入另一个活动(使用ActivityGroup)内部。
在这里插入图片描述
几乎所有的Activit都会实现两个方法
onCrate()方法:
onCreate(Bundle)是初始化界面的地方。最重要的是,在这里你通常会调用setContentView(int)和一个定义你的UI的布局资源,并且使用findViewById(int)来检索你需要以编程方式进行交互的那个UI中控件。
onPause()方法:
onPause()是你对于用户离开界面的处理。最重要的是,此时用户所做的任何更改都应该提交(通常发送给持有数据的ContentProvider。
二、Activity的生命周期
Activity的生命周期是个老生常谈的问题了,现在大多面试也都不怎么问这个问题了。但是深刻理解和掌握它的生命周期在开发中还是很重要的。
在这里插入图片描述
看看源码中Activity的各个生命周期方法。
①onCreate():
在这里插入图片描述
在第一次创建活动时调用。 这是你应该完成所有常规静态设置的位置:创建视图,将数据绑定到列表等。此方法还会为你提供一个包含Activity先前保存页面状态的Bundle对象(如果有的话)。总是跟着onStart()方法。
②onStart():
在这里插入图片描述
当Activity对用户变得可见的时候调用。如果活动进入前台,则跟随执行onResume()方法,如果隐藏,则执行onStop()。
此时,Activity实际上就已经可见了,但是还没有出现在前台,无法和用户进行交互。
③onResume():
在这里插入图片描述
当界面对用户变得可见时调用。
如果界面进入前台,则跟随onResume()方法,如果隐藏,则执行onStop()方法。
此时,Activity已经可见,并且出现在前台并开始活动。要注意的是onStart()被执行时Activity显示在后台,只有当OnResume()被执行时Activity才显示到前台。
④onPause():
在这里插入图片描述
onPause()方法在系统即将开始显示之前的界面时调用。 这通常用于将未保存的更改进行保存,并保存为持久化数据,并且会执行例如停止动画和其他可能消耗CPU的内容等。此方法的实现必须非常快速,因为在此方法返回之前,下一个界面不会显示。
如果界面返回到前台,则跟随onResume();如果对用户不可见,则使用onStop()。

onPause()方法执行后,Activity界面切换为后台程序
⑤onStop():
在这里插入图片描述
onStop()方法会在当界面对用户不再可见时调用,因为另一项界面正在显示并要去覆盖这个界面。 这可能是因为一项新的界面正在开始,其他的界面会被显示为前台界面,或者这个界面正在被摧毁。如果这个界面快速的回显与用户交互紧接着onRestart()会被执行,否则,这个界面会调用销毁onDestroy()方法会被执行。
⑥onRestart():
在这里插入图片描述
在你的界面停止后调用,然后再次启动。 总是跟着onStart()
⑦onDestroy()方法:
在这里插入图片描述
在你的界面被销毁前最后调用的方法。 这可能是因为界面正在结束(有人在其中调用finish()方法因为系统会暂时销毁此Activity界面的实例以节省空间,你可以使用isFinishing()方法区分内存空间是否节省资源的这两种情况)。
onCreat和onDestroy 分别表示Activity的创建和销毁,只会调用一次.
onStart和onStop 表示Activity是否可见,此时是后台可见;可以调用很多次,随着用户操控屏幕点亮熄灭会被调用;
onResume 和onPause 表示Activity是否位于前台 可以调用很多次;
三、举例说明Activity的生命周期方法的执行流程
Activity生命周期的执行,有两个Activity第一个FirstActivity和SecondActivity
程序第一次运行
01-07 15:02:37.521 13619-13619/com.example.wcystart.wcystart I/FirstActivity: 执行了FirstActivity的onCreate()
01-07 15:02:37.521 13619-13619/com.example.wcystart.wcystart I/FirstActivity: 执行了FirstActivity的onStart()
01-07 15:02:37.523 13619-13619/com.example.wcystart.wcystart I/FirstActivity: 执行了FirstActivity的onResume()
当点击FirstActivity中的Button按钮时,跳转到第二个Activity则执行
FirstActivity: 执行了FirstActivity的onPause()

SecondActivity: 执行了SecondActivity的onCreate()
SecondActivity: 执行了SecondActivity的onStart()
SecondActivity: 执行了SecondActivity的onResume()

FirstActivity: 执行了FirstActivity的onSaveInstanceState()
FirstActivity: 执行了FirstActivity的 onStop()
当此时按下Home键时。
SecondActivity: 执行了SecondActivity的onPause()

SecondActivity: 执行了SecondActivity的onSaveInstanceState()
SecondActivity: 执行了SecondActivity的 onStop()
在重新打开程序‘
SecondActivity: 执行了SecondActivity的onStart()
SecondActivity: 执行了SecondActivity的onResume()
此时在按下返回键,返回到FirstActivity
SecondActivity: 执行了SecondActivity的onPause()

FirstActivity: 执行了FirstActivity的onRestart()
FirstActivity: 执行了FirstActivity的onStart()
FirstActivity: 执行了FirstActivity的onResume()

SecondActivity: 执行了SecondActivity的 onStop()
SecondActivity: 执行了SecondActivity的onDestroy()
再接着按返回键,退出程序
FirstActivity: 执行了FirstActivity的onPause()
FirstActivity: 执行了FirstActivity的 onStop()
FirstActivity: 执行了FirstActivity的onDestroy()
四、异常情况下Activity的生命周期变化
①横竖屏切换,Activity生命周期的变换
首先第一次打开程序进入FristActivity
FirstActivity: 执行了FirstActivity的onCreate()
FirstActivity: 执行了FirstActivity的onStart()
FirstActivity: 执行了FirstActivity的onResume()
此时旋转了屏幕之后:
FirstActivity: 执行了FirstActivity的onPause()
FirstActivity: 执行了FirstActivity的onSaveInstanceState()
FirstActivity: 执行了FirstActivity的 onStop()
FirstActivity: 执行了FirstActivity的onDestroy()

FirstActivity: 执行了FirstActivity的onCreate()
FirstActivity: 执行了FirstActivity的onStart()
FirstActivity: 执行了FirstActivity的onRestoreInstanceState()
FirstActivity: 执行了FirstActivity的onResume()
但是如果在功能清单文件中给Activity配置了android:configChanges
<activity android:name=".FirstActivity" android:configChanges=“screenSize|orientation|keyboardHidden”>




在重新启动程序
FirstActivity: 执行了FirstActivity的onCreate()
FirstActivity: 执行了FirstActivity的onStart()
FirstActivity: 执行了FirstActivity的onResume()
旋转屏幕之后,就不在执行Activity的生命周期方法了,只是执行了onConfigurationChanged这个方法
FirstActivity: 执行了onConfigurationChanged
FirstActivity: 当前是横屏
来说说这个configChanges的各种配置都是干什么的吧
在这里插入图片描述
②资源内存不足导致优先级别低的Activity被杀死
Activity按照优先级从高到低,可分为如下三种:
(1)前台Activity——正在和用户交互的Activity,优先级最高
(2)可见但非前台Activity——比如Activity中弹出了一个对话框,导致Activity可见但是位于后台无法与用户直接交互。
(3)后台Activity——已经被暂停的Activity,比如执行了onStop,优先级最低。
当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程,并且后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死,比较好的方法是将后台工作放入Service中从而保证进程有一定的优先级,这样就不会轻易地被系统杀死。
补充:onSaveInstanceState()和onRestoreInstanceState()方法的调用时机
onSaveInstanceState调用时机:系统异常终止时,调用onSavaInstanceState来保存状态。该方法调用在onStop之前,但和onPause没有时序关系。
onRestoreInstanceState调用时机:调用onRestoreInstanceState(该方法在onStart之后),并将onSavaInstanceState保存的Bundle对象作为参数传到onRestoreInstanceState与onCreate方法。
可通过onRestoreInstanceState(Bundle savedInstanceState)和onCreate((Bundle savedInstanceState)来判断Activity是否被重建,并取出数据进行恢复。但需要注意的是,在onCreate取出数据时一定要先判断savedInstanceState是否为空。另外,谷歌更推荐使用onRestoreInstanceState进行数据恢复。
五、当在Activity中弹出一个Dialog框时生命周期的变化
①如果是单纯的创建一个AlertDialog
在FirstAcivity中点击Button按钮,弹出一个AlertDialog。并不会执行Activity的生命周期方法。
②如果跳转到一个引用了全透明主题或者是半透明主题的样式的Activity时,则第一个Activity不会执行onStop方法
即在功能清单文件中给SecondActivity引用主题样式
在这里插入图片描述
全透明主题:

<style name="myTransparent" parent="AppTheme">
       <item name="android:windowBackground">@color/transparent</item>
       <item name="android:windowAnimationStyle">@null</item>
       <item name="android:windowIsTranslucent">true</item>
       <item name="android:windowNoTitle">true</item> <!-- 无标题 -->
       <item name="android:windowContentOverlay">@null</item>
   </style>

半透明主题:

 <style name="myTransparent" parent="AppTheme">
       <item name="android:windowBackground">@color/transparent</item>
       <item name="android:windowAnimationStyle">@null</item>
       <item name="android:windowIsTranslucent">true</item>
       <item name="android:windowNoTitle">true</item> <!-- 无标题 -->
       <item name="android:backgroundDimEnabled">true</item><!-- 半透明 -->
       <item name="android:windowContentOverlay">@null</item>
   </style> 

此时点击FirstActivity中的Button按钮跳转到SecondActivity中时,所执行的生命周期方法是:
FirstActivity: 执行了FirstActivity的onPause()

SecondActivity: 执行了SecondActivity的onCreate()
SecondActivity: 执行了SecondActivity的onStart()
SecondActivity: 执行了SecondActivity的onResume()
事实证明并没有执行onStop方法
六、总结
(1)Activity的四种状态
简单点来说
运行状态:可见也可操作
暂停状态:可见但不可操作
停止状态:不可见,但是对象存在
死亡状态:对象不存在
Activity:是与用户交互的接口,提供了与用户操作的窗口
Active:活动状态,栈顶,可见,和用户进行交互
Pause:暂停状态,当Activity失去焦点的时候,被一个新的非全屏的Activity挡住的时候,这时的Activity就处于暂停状态,处于这个状态的Activity只是失去了与用户交互的能力,它所有的数据,状态,成员变量,都是存在的。只有在系统内存不足的时候,才有可能被系统回收掉。 可见不可交互
Stop:停止状态,当一个Activity被另一个Activity完全覆盖的时候,被覆盖的原来的Activity就会处于暂停状态。与Pause状态相同的地方是:当系统内存足够的时候,activity的数据,状态,成员变量都是存在的,只有当系统内存不足的时候,才有可能被回收掉。
Kill:死亡状态,当Activity被系统回收的时候
复杂点来说:
Running:是指Activity在系统中获得焦点的状态,此时用户可以与该程序进行交互,对程序进行直接操作。
Paused :是指Activity在系统中未获得焦点,但对用户来说仍然可视的状态,该Activity上层可能有一个透明、对于用户不 可见的Activity层或者有一个Dialog样式的Activity层,都会让Activity进入Paused状态。此状态下该Activity无法和用户进行直接交互。
Stopped:是当该Activity在系统中失去焦点并且上层存在不透明的、非Dialog样式的Activity(即对用户不可视)的状态。此状态下,该Activity的数据毁在RAM中暂时保留,但是,一旦系统需要内存,这种处于Stopped状态的Activity占用的RAM空间会优先被清理并重新利用。所以,在Activity处于Stopped状态时,必须要保存该Activity的UI状态,否则一旦RAM空间被重新利用,UI状态和数据就完全丢失。
Killed:是指Activity在RAM中被移除或者说关闭的状态。也就是说此时Activity处于关闭的状态,不占用RAM空间。(2)Activity的7个生命周期方法的调用时机,以及在合适的时机做哪些正确的操作?
①onCreate(Bundle savedInstanceState):
状态: 创建
调用时机:当一个Activity被创建的时候
所做操作:加载布局页面,初始化数据
补充:onCreate(xxx)是所有回调方法中唯一有参的,该参数保存了上次由于Activity被动回收时所保存的据。
②onStart()
状态:正被启动,可见,但是还没出现在前台,不能与用于交互
调用时机:从create状态过来
从stopped状态过来,从这种状态过来还会先经过onRestart()方法
所做操作:onStart()到onResume的过程中,还可能会回调onRestoreInstanceState,onNewIntent、onActivityResult这几个方法。
③onResume():
状态:Activity获取焦点,在前台展示,并可与用户交互
调用时机:当Activity可见并且可操作的时候调用
所做操作:在可见时重新拉取一些需要及时刷新的数据、注册 ContentProvider的监听,最重要的是在onPause()中的一些释放操作要在这里面恢复回来。
④onPause():
状态:暂停状态,Activity部分不可见,例如一个半透明的界面覆盖在了上面,这时候只要Activity仍然有一部分可见,那么它会一直保持在Paused状态。
调用时机:系统准备去启动或恢复另一个activity时调用,activity即将从可见变为不可见状态。
所做操作:可以保存一些必要数据到持久化的存储,不可做太耗时的操作,释放系统资源,例如先前注册的广播、使用的传感器(如GPS)、以及一些仅当页面获得焦点时才需要的资源。
⑤onStop():
状态:停止状态,activity已经完全不可见了
调用时机:当Activity完全不可见的时候调用
所做操作:官方文档有谈到,当onStop()执行完之后,系统有可能会销毁这个Activity实例,在某些极端情况下,有可能不会回调onDestroy()方法,因此,我们需要在onStop()当中释放掉一些资源来避免内存泄漏
**⑥onDestroy()?*销毁状态,当按返回键的时候
**⑦onRestart()?*被停止后的Activity在次启动时,调用的方法

猜你喜欢

转载自blog.csdn.net/qq_37982823/article/details/86016641