四大组件之activity活动周期

Activity 类中定义了七个回调方法,覆盖了活动生命周期的每一个环节,下面我来一一介绍下这七个方法。
1.  onCreate()
这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作,比如说加载布局、绑定事件等。
2.  onStart()

这个方法在活动由不可见变为可见的时候调用。
3.  onResume()
这个方法在活动准备好和用户进行交互的时候调用。 此时的活动一定位于返回栈的栈顶,并且处于运行状态。
4.  onPause()
这个方法在系统准备去启动或者恢复另一个活动的时候调用。 我们通常会在这个方法中将一些消耗 CPU 的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。
5.  onStop()
这个方法在活动完全不可见的时候调用。 它和 onPause()方法的主要区别在于, 如果启动的新活动是一个对话框式的活动, 那么 onPause()方法会得到执行, 而 onStop()方法并不会执行。
6.  onDestroy()
这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。
7.  onRestart()
这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。以上七个方法中除了 onRestart()方法,其他都是两两相对的,从而又可以将活动分为三种生存期。
1.  完整生存期
活动在 onCreate()方法和 onDestroy()方法之间所经历的,就是完整生存期。一般情况下,一个活动会在 onCreate()方法中完成各种初始化操作,而在 onDestroy()方法中完成释放内存的操作。
2.  可见生存期
活动在 onStart()方法和 onStop()方法之间所经历的,就是可见生存期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两个方法,合理地管理那些对用户可见的资源。比如在 onStart()方法中对资源进行加载,而在 onStop()方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。
3.  前台生存期
活动在 onResume()方法和 onPause()方法之间所经历的,就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行相互的,我们平时看到和接触最多的也这个状态下的活动



打开一个MainActivity:(MainActivity中有两个按钮,一个跳转到Secondactivity,一个跳转到Dialogactivity,    android:theme="@android:style/Theme.Dialog");


可以看到,当 MainActivity 第一次被创建时会依次执行 onCreate()、onStart()和onResume()方法,

然后点击第一个按钮,启动 SecondActivity,由于 SecondActivity已经把 MainActivity 完全遮挡住, 因此 MainActivity onPause()和 onStop()
方法都会得到执行。SecondActivity创建 执行 onCreate()、onStart()和onResume()方法


然后按下 Back 键返回 MainActivity


由于之前 MainActivity 已经进入了停止状态,所以 onRestart()方法会得到执行,之
后又会依次执行 onStart()和 onResume()方法。注意此时 onCreate()方法不会执行,因
为 MainActivity 并没有重新创建。


然后再点击第二个按钮,启动 DialogActivity


可以看到,只有 onPause()方法得到了执行,onStop()方法并没有执行,这是因为
DialogActivity 并没有完全遮挡住 MainActivity, 此时 MainActivity 只是进入了暂停状态,
并没有进入停止状态。相应地,按下 Back 键返回 MainActivity 也应该只有 onResume()
方法会得到执行



最后在 MainActivity 按下 Back 键退出程序



依次会执行 onPause()、onStop()和 onDestroy()方法,最终销毁 MainActivity


再次打开MainActivity


屏幕息屏


再次唤醒



前面我们已经说过,当一个活动进入到了停止状态,是有可能被系统回收的。那么想象以下场景,应用中有一个活动 A,用户在活动 A 的基础上启动了活动 B,活动 A 就进入了
停止状态,这个时候由于系统内存不足,将活动 A 回收掉了,然后用户按下 Back 键返回活动 A,会出现什么情况呢?其实还是会正常显示活动 A 的,只不过这时并不会执行
onRestart()方法,而是会执行活动 A 的 onCreate()方法,因为活动 A 在这种情况下会被重新创建一次。这样看上去好像一切正常,可是别忽略了一个重要问题,活动 A 中是可能存在临时数据和状态的。打个比方,MainActivity 中有一个文本输入框,现在你输入了一段文字,然后启动 NormalActivity,这时 MainActivity 由于系统内存不足被回收掉,过了一会你又点击了 Back 键回到 MainActivity, 你会发现刚刚输入的文字全部都没了, 因为 MainActivity被重新创建了。如果我们的应用出现了这种情况,是会严重影响用户体验的,所以必须要想想办法解决这个问题。查阅文档可以看出,Activity 中还提供了一个 onSaveInstanceState()回调方法,这个方法会保证一定在活动被回收之前调用,因此我们可以通过这个方法来解决活动被回收时临时数据得不到保存的问题。onSaveInstanceState()方法会携带一个 Bundle 类型的参数,Bundle 提供了一系列的方法用于保存数据,比如可以使用 putString()方法保存字符串,使用 putInt()方法保存整型数据, 以此类推。 每个保存方法需要传入两个参数, 第一个参数是键, 用于后面从 Bundle中取值,第二个参数是真正要保存的内容。在 MainActivity 中添加如下代码就可以将临时数据进行保存:


数据是已经保存下来了,那么我们应该在哪里进行恢复呢?细心的你也许早就发现,我们一直使用的 onCreate()方法其实也有一个 Bundle 类型的参数。这个参数在一般情况下
都是 null,但是当活动被系统回收之前有通过 onSaveInstanceState()方法来保存数据的话,这个参数就会带有之前所保存的全部数据,我们只需要再通过相应的取值方法将数据取出即可




屏幕转换

当屏幕转动切换的时候 Android 机制是:
销毁当前屏幕的 Activity ,然后重新开启一个新的适应屏幕改变的 Activity 。

在manifest里写:android:configChanges="orientation|keyboard|keyboardHidden"

java文件:import android.content.res.Configuration;

public void
onConfigurationChanged( Configuration newConfig )
{
    // 一定要先调用父类的同名函数,让框架默认函数先处理
    // 下面这句一定不能省去,否则将引发:android.app.SuperNotCalledException 异常。
    super.onConfigurationChanged( newConfig );
 }

表示在改变屏幕方向、弹出软件盘和隐藏软键盘时,不再去执行 onCreate() 方法,
而是直接执行 onConfigurationChanged() 。
如果不申明此段代码,按照Activity的生命周期,都会去执行一次 onCreate() 方法,
而 onCreate() 方法通常会在显示之前做一些初始化工作。

所以如果改变屏幕方向这样的操作都去执行 onCreate() 方法,就有可能造成重复的初始化,
降低程序效率是必然的了,而且更有可能因为重复的初始化而导致数据的丢失。
这是需要避免的!

新建一个 Activity ,运行 Activity ,得到如下信息:




切成横屏时



切成竖屏时:

发现执行了2遍



修改 AndroidManifest.xml 文件中的 Activity 元素,
添加 android:configChanges="orientation" ,
换成横屏时:(与上面无修改时相同)


发现不会再打印相同信息,
但多打印了一行 onConfigChanged 


修改 AndroidManifest.xml 文件中的 Activity 元素,
把 android:configChanges="orientation" 改成
  android:configChanges="orientation|keyboardHidden",
切换成横屏时,
就只打印 onConfigChanged :
onConfigurationChanged

 切换成竖屏时:
onConfigurationChanged
onConfigurationChanged

总结:
1.不设置 AndroidManifest.xml 文件中的 Activity 元素的 android:configChanges 时,
  切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;

2.设置了 AndroidManifest.xml 文件中的 Activity 元素的
  android:configChanges="orientation"时,
  切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次;

3.设置了 AndroidManifest.xml 文件中的 Activity 元素的
  android:configChanges="orientation|keyboardHidden"时,
  切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法!


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值