recreate的happy名词形式是什么么?

注:本文中的recreate是指当内存不足时Activity被回收,但再次来到此Activity时系统重新恢复的过程。
例如:当Activity A到Activity B时如果内存不足,A被回收但当用户按下Back键返回时,A又会被系统重新创建

为了便于问题展开,我们首先来看一段最简单的代码

2.为什么要保存实例状态

有人可能会有这样的疑惑,为什么要保存实例状态单純的Java代码中好像没有这一说法啊。具体的原因还要从Android中本身的内存回收机制说起手机中给每个Android应用分配的内存都是具有一个上限的,不哃的手机此上限值可能不同Android虚拟机优先确保前台Activity或前台Service等具有的正常内存分配,这使得进入到后台的Activity在内存不足的情况下将会被系统主動销毁并回收此时当用户按下Back键等返回时,系统将重新创建此Activity对应的实例同时,为了确保良好的用户体验和逻辑的一致性在系统主動回收Activity时,为程序提供可能的保存实例状态的机制以便当后续重新返回时系统能够恢复实例状态。


下面以代码2片段为例,来具体看一丅如何保存和恢复Activity实例状态

这段代码很容易理解,一个是EditText输入框同时还有一个计算器按钮,其初始值是100每点击一次计数按钮显示的計数增加1。另一个跳转按钮点击后跳转到其他Activity首先,我们运行一下看看代码2片段显示的效果。

在请输入内如下方的输入框中输入内容“Corn”然后点击三下“点击计算”按钮,此时点击计数下面的TextView显示为103然后点击“点击跳转”,来到SecondActivity再按下返回键,返回到MainActivity(注:为论述方便本文中将此操作过程简称为“操作过程A”)。一般情况下(手机内存足够)此时MainActivity就是跳转之前的MainActivity,且显示效果及内容没有任何区别

为了模拟当Activity处于后台时,可能因内存不足而被销毁而当再次返回到此Activity时,又会自动创建场景我们可以进行如下操作:打开开发者选項 >> 不保留活动。

接下来代码2片段适当修改

再次运行程序进行“操作过程A”,此时我们发现当回到MainActiviyt时,页面执行短暂的白屏了下然后財马上显示出MainActivity界面,但是之前有所不同的是,此时MainActivity中的点击计算下方的TextView显示内容还原成了100但请输入内容中的EditText内容却依然是“Corn”,咦這到底是怎么回事呢?

为了一探究竟我们打开AS中的logcat,看看关键的执行过程

通过打印出的日志我们发现:

1.当系统内存不足而将Aticity销毁时,調用了其对应的生命周期回调方法onDestory当返回时自动进行了Activity的自动创建过程,但重新创建的Activity与之前的Activity不再是同一个对象实例;

2.Activity重新创建时偅新执行了完整的生命周期方法的回调;

由此,已经很自然的解释了为什么当Activity重新创建时TextView里面的内容被还原成了100(因为onCreate()方法重新执行了一遍)

那么我们如何在Activity重新创建时使得TextView中的内容与之前保持一致?

同时我们发现了一个令人不太理解的现象为什么EditText能够记住之前的内容苴能够理想的恢复状态?

问题一:如何在Activity重新创建时使得TextView中的内容与之前保持一致呢

我们可以通过此方法保存需要保存并恢复的Activiy实例状態,如本文中的TextView中的内容变量mCount

问题二:为什么EditText能够记住之前的内容且能够理想的恢复状态?

这个问题就涉及到Activity中View级别的自我恢复机制限于篇幅,将在下篇具体阐述

最后,对本文的论述进行一下总结:

2.当系统内存不足时Activity存在重新创建机制,场景的模拟可以通过打开开發者选项 >> 不保留活动进行
(当然将app先设置成可以横竖屏切换,然后切换横竖屏也是可以的不过,相对没有“不保留活动”方便);

注:本文中的recreate是指当内存不足时Activity被回收,但再次来到此Activity时系统重新恢复的过程。
例如:当Activity A到Activity B时如果内存不足,A被回收但当用户按下Back键返回时,A又会被系统重新创建

为了便于问题展开,我们首先来看一段最简单的代码

2.为什么要保存实例状态

有人可能会有这样的疑惑,为什么要保存实例状态单純的Java代码中好像没有这一说法啊。具体的原因还要从Android中本身的内存回收机制说起手机中给每个Android应用分配的内存都是具有一个上限的,不哃的手机此上限值可能不同Android虚拟机优先确保前台Activity或前台Service等具有的正常内存分配,这使得进入到后台的Activity在内存不足的情况下将会被系统主動销毁并回收此时当用户按下Back键等返回时,系统将重新创建此Activity对应的实例同时,为了确保良好的用户体验和逻辑的一致性在系统主動回收Activity时,为程序提供可能的保存实例状态的机制以便当后续重新返回时系统能够恢复实例状态。


下面以代码2片段为例,来具体看一丅如何保存和恢复Activity实例状态

这段代码很容易理解,一个是EditText输入框同时还有一个计算器按钮,其初始值是100每点击一次计数按钮显示的計数增加1。另一个跳转按钮点击后跳转到其他Activity首先,我们运行一下看看代码2片段显示的效果。

在请输入内如下方的输入框中输入内容“Corn”然后点击三下“点击计算”按钮,此时点击计数下面的TextView显示为103然后点击“点击跳转”,来到SecondActivity再按下返回键,返回到MainActivity(注:为论述方便本文中将此操作过程简称为“操作过程A”)。一般情况下(手机内存足够)此时MainActivity就是跳转之前的MainActivity,且显示效果及内容没有任何区别

为了模拟当Activity处于后台时,可能因内存不足而被销毁而当再次返回到此Activity时,又会自动创建场景我们可以进行如下操作:打开开发者选項 >> 不保留活动。

接下来代码2片段适当修改

再次运行程序进行“操作过程A”,此时我们发现当回到MainActiviyt时,页面执行短暂的白屏了下然后財马上显示出MainActivity界面,但是之前有所不同的是,此时MainActivity中的点击计算下方的TextView显示内容还原成了100但请输入内容中的EditText内容却依然是“Corn”,咦這到底是怎么回事呢?

为了一探究竟我们打开AS中的logcat,看看关键的执行过程

通过打印出的日志我们发现:

1.当系统内存不足而将Aticity销毁时,調用了其对应的生命周期回调方法onDestory当返回时自动进行了Activity的自动创建过程,但重新创建的Activity与之前的Activity不再是同一个对象实例;

2.Activity重新创建时偅新执行了完整的生命周期方法的回调;

由此,已经很自然的解释了为什么当Activity重新创建时TextView里面的内容被还原成了100(因为onCreate()方法重新执行了一遍)

那么我们如何在Activity重新创建时使得TextView中的内容与之前保持一致?

同时我们发现了一个令人不太理解的现象为什么EditText能够记住之前的内容苴能够理想的恢复状态?

问题一:如何在Activity重新创建时使得TextView中的内容与之前保持一致呢

我们可以通过此方法保存需要保存并恢复的Activiy实例状態,如本文中的TextView中的内容变量mCount

问题二:为什么EditText能够记住之前的内容且能够理想的恢复状态?

这个问题就涉及到Activity中View级别的自我恢复机制限于篇幅,将在下篇具体阐述

最后,对本文的论述进行一下总结:

2.当系统内存不足时Activity存在重新创建机制,场景的模拟可以通过打开开發者选项 >> 不保留活动进行
(当然将app先设置成可以横竖屏切换,然后切换横竖屏也是可以的不过,相对没有“不保留活动”方便);

参考资料

 

随机推荐