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

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

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

	@Override
protected 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

我们会看到如下一个图:

这幅图就是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 { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("大碗干拌", "调用了onCreate方法");
setContentView(R.layout.activity_main);
} @Override
protected void onSaveInstanceState(Bundle outState) {
Log.i("大碗干拌", "调用了SaveState方法");
super.onSaveInstanceState(outState);
} @Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
Log.i("大碗干拌", "调用了RestoreState方法");
super.onRestoreInstanceState(savedInstanceState);
} @Override
protected void onDestroy() {
Log.i("大碗干拌", "调用了onDestroy方法");
super.onDestroy();
} @Override
protected void onPause() {
Log.i("大碗干拌", "调用了onPause方法");
super.onPause();
} @Override
protected void onRestart() {
Log.i("大碗干拌", "调用了onRestart方法");
super.onRestart();
} @Override
protected void onResume() {
Log.i("大碗干拌", "调用了onResume方法");
super.onResume();
} @Override
protected void onStart() {
Log.i("大碗干拌", "调用了onStart方法");
super.onStart();
} @Override
protected void onStop() {
Log.i("大碗干拌", "调用了onStop方法");
super.onStop();
}
}

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

运行后打印Log如下:

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

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

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

看看官方对onRestroeState的解释:

This method is called after onStart() when the activity is being re-initialized from a previously saved state, given here in savedInstanceState. Most implementations will simply use onCreate(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 by onSaveInstanceState(Bundle).

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

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

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

1、按HOME键

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

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

4、启动另一个新的Activity

5、切换屏幕方向

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

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

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

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

打印的Log

Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)的更多相关文章

  1. Android菜鸟的成长笔记(11)——Android中的事件处理

    原文:[置顶] Android菜鸟的成长笔记(11)——Android中的事件处理 Android提供了两种方式来处理事件,一个是基于回调的事件处理,另一个是基于监听的事件处理,举个例子: 基于回调的 ...

  2. Android菜鸟的成长笔记(17)—— 再看Android中的Unbounded Service

    原文:Android菜鸟的成长笔记(17)-- 再看Android中的Unbounded Service 前面已经写过关于startService(Unbounded Service)的一篇文章:&l ...

  3. Android菜鸟的成长笔记(15)—— Android中的状态保存探究(下)

    原文:Android菜鸟的成长笔记(15)-- Android中的状态保存探究(下) 在上一篇中我们简单了解关于Android中状态保存的过程和原理,这一篇中我们来看一下在系统配置改变的情况下保存数据 ...

  4. Android菜鸟的成长笔记(3)——给QQ登录界面说So Easy

    原文:Android菜鸟的成长笔记(3)--给QQ登录界面说So Easy 上一篇:Android菜鸟的成长笔记(2)--第一个Android应用 我们前面已经做了第一个Android应用程序,虽然有 ...

  5. Android菜鸟的成长笔记(2)——第一个Android应用

    原文:Android菜鸟的成长笔记(2)--第一个Android应用 上一篇:Android菜鸟的成长笔记(1)--Anddroid环境搭建从入门到精通 在上一篇Android菜鸟的成长笔记(1)中我 ...

  6. Android菜鸟的成长笔记(1)——Android开发环境搭建从入门到精通

    原文:Android菜鸟的成长笔记(1)--Android开发环境搭建从入门到精通 今天在博客中看到好多Android的初学者对Android的开发环境的搭建不熟悉而导致不能进行学习,所以我决定自己写 ...

  7. Android菜鸟的成长笔记(13)——异步任务(Async Task)

    原文:[置顶] Android菜鸟的成长笔记(13)——异步任务(Async Task) Android的UI线程主要负责处理用户的事件及图形显示,因此主线程UI不能阻塞,否则会弹出一个ANR(App ...

  8. Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue

    原文:[置顶] Android菜鸟的成长笔记(12)——Handler.Loop.MessageQueue 当一个程序第一次启动时,Android会启动一条主线程(Main Thread),主线程主要 ...

  9. Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值

    原文:[置顶] Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值 前面我们了解了如何启动一个Activity,一个Activity在启动另外一个Activity的时候 ...

随机推荐

  1. 【Dior风格/舒适防风面料/抗静电里衬/大身撞色拼接/精致平驳领/时尚便西款/蓝绿色】玛萨玛索男装网购商城

    [Dior风格/舒适防风面料/抗静电里衬/大身撞色拼接/精致平驳领/时尚便西款/蓝绿色]玛萨玛索男装网购商城 [特价商品] Dior风格/舒适防风面料/抗静电里衬/大身撞色拼接/精致平驳领/时尚便西款 ...

  2. 西安力邦智能医疗&可穿戴设备沙龙--第1期---苹果HealthKit、谷歌GoogleFit来袭,智能医疗要爆发吗?

    背    景: "可穿戴设备"成为2014的行业热点,从Google Glass到苹果iWatch, 越来越多的企业推出了包含眼镜.腕带.鞋等各种可穿戴设备,"可穿戴&q ...

  3. UVA 10763 Foreign Exchange 出国交换 pair+map

    题意:给出很多对数字,看看每一对(a,b)能不能找到对应的(b,a). 放在贪心这其实有点像检索. 用stl做,map+pair. 记录每一对出现的次数,然后遍历看看对应的那一对出现的次数有没有和自己 ...

  4. Linux内核空间-用户空间通信之debugfs

    一.debugfs文件系统简介 debugfs虚拟文件系统是一种内核空间与用户空间的接口,基于libfs库实现,专用于开发人员调试,便于向用户空间导出内核空间数据(当然,反方向也可以).debugfs ...

  5. 找出并解决 JavaScript 和 Dojo 引起的浏览器内存泄露问题

    简介: 如果大量使用 JavaScript 和 Ajax 技术开发 Web 2.0 应用程序,您很有可能会遇到浏览器的内存泄漏问题.如果您有一个单页应用程序或者一个页面要处理很多 UI 操作,问题可能 ...

  6. HTML5小游戏《智力大拼图》发布,挑战你的思维风暴

    一,前言   本 游戏 是鄙人研究lufylegend数日之后,闲暇之余写下的.本游戏运用全新的技术 html 5写成的.游戏引擎为国产的lufylegend.js,大家可以去它的官网看看.游戏处于测 ...

  7. UPC 2959: Caoshen like math 这就是个水题

    http://acm.upc.edu.cn/problem.php?id=2959 这就是个水题,之所以要写这个题是感觉很有纪念意义 用力看就是盲……23333333333333333 这个题就是最小 ...

  8. ARMv8 Linux内核head.S源码分析

    ARMv8Linux内核head.S主要工作内容: 1. 从el2特权级退回到el1 2. 确认处理器类型 3. 计算内核镜像的起始物理地址及物理地址与虚拟地址之间的偏移 4. 验证设备树的地址是否有 ...

  9. 【BOI2007】【BZOJ1176】Mokia

    1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MB Submit: 1059 Solved: 432 [Submit][St ...

  10. 关于innodb purge thread和master thread

    由innodb_purge_threads控制purge线程数. (>= 5.6.5)的版本号中该值默觉得1.最大值为32.默认值1表示innodb的purge操作被分离到purge线程中,ma ...