原文: [置顶] Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)

我们在用手机的时候可能会发现,即使应用被放到后台再返回到前台数据依然保留(比如说我们正在玩游戏,突然电话来了,当接完电话游戏继续玩),某些应用甚至会保留你离开时候的状态及数据,这些原理是什么?怎么去实现这样的应用?这将是我们这一篇文章要解开的问题。

有一句很常见的代码如下,很多人不知道为什么要加这么一句话

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}

super.onCreate(savedInstanceState)中的saveInstanceState是什么东西,为什么我们必须给onCreate方法返回一个Bundle对象呢?

打开官网关于Activity的介绍:http://developer.android.com/guide/components/activities.html

我们会看到如下一个图:

Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)_第1张图片

这幅图就是Activity状态保存过程,从图中可以看到,如果其他Activity在该Activity之前就会调用onSaveInstanceState()方法,下面我们就来重载该方法看一下。

package com.example.myfirstapp;import android.os.Bundle;import android.app.Activity;import android.util.Log;import android.view.Menu;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.i("大碗干拌", "调用了onCreate方法");setContentView(R.layout.activity_main);}@Overrideprotected void onSaveInstanceState(Bundle outState) {Log.i("大碗干拌", "调用了SaveState方法");super.onSaveInstanceState(outState);}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {Log.i("大碗干拌", "调用了RestoreState方法");super.onRestoreInstanceState(savedInstanceState);}@Overrideprotected void onDestroy() {Log.i("大碗干拌", "调用了onDestroy方法");super.onDestroy();}@Overrideprotected void onPause() {Log.i("大碗干拌", "调用了onPause方法");super.onPause();}@Overrideprotected void onRestart() {Log.i("大碗干拌", "调用了onRestart方法");super.onRestart();}@Overrideprotected void onResume() {Log.i("大碗干拌", "调用了onResume方法");super.onResume();}@Overrideprotected void onStart() {Log.i("大碗干拌", "调用了onStart方法");super.onStart();}@Overrideprotected void onStop() {Log.i("大碗干拌", "调用了onStop方法");super.onStop();}}

原来当activity进程被系统杀掉后再重新启动的时候会调用onCreate()方法和onRestoreInstanceState()方法将onSaveInstanceState()保存的Bundle对象传递过来,现在明白前面的super.onCreate(savedInstanceState)的作用了,是恢复Activity的状态数据。

运行后打印Log如下:

当我调至停止状态时(手机屏幕关掉):

可以看到调用了SaveState方法,当我恢复的时候(手机屏幕打开)

我们再看看如果直接杀死进程(kill)后,打印的Log

Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)_第2张图片

Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)_第3张图片

看看官方对onRestroeState的解释:

This method is called afteronStart()when the activity is being re-initialized from a previously saved state, given here insavedInstanceState. Most implementations will simply useonCreate(Bundle)to restore their state, but it is sometimes convenient to do it here after all of the initialization has been done or to allow subclasses to decide whether to use your default implementation. The default implementation of this method performs a restore of any view state that had previously been frozen byonSaveInstanceState(Bundle).

从官方说明中可以看出,如果系统认为该Activity存在被系统收回(销毁)的危险,比如说stop()状态,则系统会调用onSaveInstanceState(Bundle)方法保存当前状态,如果该Activity是正常主动销毁则不会调用该方法。

下面是之间按手机上的BACK键,打印的Log

有如下几种情系统会调用onSaveInstanceState方法:

1、按HOME键

2、长按HOME键选择其他程序

3、按下电源(关闭屏幕)

4、启动另一个新的Activity

5、切换屏幕方向

另外官方还提到,onSaveInstanceState和onRestoreInstanceState不一定是成对出现的,例如:先按下HOME再长按HOME回到该Activity打印的Log如下

Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)_第4张图片

虽然是这样能保存状态数据,这个是系统为我们Activity状态保存提供的一个机制,但是通常我们再开发的时候可能会有目的的去保存一些数据,这样我们可以将该数据在onStop()方法中保存。

下面我们再来证明onCreate()方法中的Bundle savedInstanceState参数是onSaveInstanceState中保存的值:

@Overrideprotected void onSaveInstanceState(Bundle outState) {Log.i("大碗干拌", "调用了SaveState方法");outState.putString("dawanganban", "欢迎关注大碗干拌的CSDN博客");super.onSaveInstanceState(outState);}
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.i("大碗干拌", "调用了onCreate方法");//正常启动时值为nullif(savedInstanceState != null){Log.i("大碗干拌", "onCreate方法中获取的值为:" +savedInstanceState.getString("dawanganban"));}setContentView(R.layout.activity_main);}

打印的Log

Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)_第5张图片





更多相关文章

  1. android实现观察者模式的几种方法
  2. Android Studio怎样提示函数使用方法
  3. 【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | Launch
  4. Android方法数
  5. 改变Android按钮背景颜色的高效方法
  6. Android双击返回键退出程序的实现方法
  7. 混合开发之ReactNative调用Android原生方法
  8. Android投屏电脑反向控制软件QtScrcpy使用方法
  9. Android隐藏状态栏 全屏

随机推荐

  1. react-native android手机webview加载htm
  2. Android Framework内核之旅
  3. 探究Android中浏览器UA的生成策略
  4. Android(安卓)CheckBox 控件突然报错
  5. android中三种onClick事件的实现,与对比
  6. android 线程 synchronized关键字
  7. 自定义ViewPager实现图片自动轮播无限循
  8. android rle格式开机logo制作
  9. android4.4调整音量调节速度
  10. 初试GreenDAO 3.2.3