Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)

简介: 原文: [置顶] Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上) 我们在用手机的时候可能会发现,即使应用被放到后台再返回到前台数据依然保留(比如说我们正在玩游戏,突然电话来了,当接完电话游戏继续玩),某些应用甚至会保留你离开时候的状态及数据,这些原理是什么?怎么去实现这样的应用?这将是我们这一篇文章要解开的问题。

原文: [置顶] 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





 

目录
相关文章
|
1月前
|
JavaScript 前端开发 Java
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
IT寒冬使APP开发门槛提升,安卓程序员需转型。选项包括:深化Android开发,跟进Google新技术如Kotlin、Jetpack、Flutter及Compose;研究Android底层框架,掌握AOSP;转型Java后端开发,学习Spring Boot等框架;拓展大前端技能,掌握JavaScript、Node.js、Vue.js及特定框架如微信小程序、HarmonyOS;或转向C/C++底层开发,通过音视频项目如FFmpeg积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
44 3
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
|
1月前
|
编解码 安全 Ubuntu
Android Selinux 问题处理笔记
这篇文章是关于处理Android系统中SELinux权限问题的笔记,介绍了如何通过分析SELinux拒绝的日志、修改SELinux策略文件,并重新编译部署来解决权限问题,同时提供了一些SELinux的背景知识和实用工具。
36 0
|
2月前
|
监控 Java Android开发
探究Android应用开发中的内存泄漏检测与修复
在移动应用的开发过程中,优化用户体验和提升性能是至关重要的。对于Android平台而言,内存泄漏是一个常见且棘手的问题,它可能导致应用运行缓慢甚至崩溃。本文将深入探讨如何有效识别和解决内存泄漏问题,通过具体案例分析,揭示内存泄漏的成因,并提出相应的检测工具和方法。我们还将讨论一些最佳实践,帮助开发者预防内存泄漏,确保应用稳定高效地运行。
|
3月前
|
Java API Android开发
技术经验分享:Android源码笔记——Camera系统架构
技术经验分享:Android源码笔记——Camera系统架构
43 0
|
4月前
|
API 调度 Android开发
打造高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第27天】在移动开发领域,性能优化和响应速度是衡量应用质量的关键因素。随着Kotlin语言的普及,协程作为其核心特性之一,为Android开发者提供了一种全新的并发处理方式。本文深入探讨了Kotlin协程在Android应用开发中的优势,并通过实例演示如何在实际项目中有效利用协程提升应用性能和用户体验。
|
3月前
|
Java Linux API
微信API:探究Android平台下Hook技术的比较与应用场景分析
微信API:探究Android平台下Hook技术的比较与应用场景分析
|
4月前
|
移动开发 Android开发 开发者
构建高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第21天】在移动开发领域,性能优化和流畅的用户体验是至关重要的。随着Kotlin语言在Android平台的广泛采纳,其并发处理的强大工具—协程(Coroutines),已成为提升应用响应性和效率的关键因素。本文将深入分析Kotlin协程的核心原理,探讨其在Android开发中的优势,并通过实例演示如何有效利用协程来优化应用性能,打造更加流畅的用户体验。
57 4
|
4月前
|
移动开发 数据库 Android开发
构建高效Android应用:探究Kotlin的协程优势
【5月更文挑战第22天】随着移动开发技术的不断进步,Android平台的性能优化已经成为开发者关注的焦点。在众多提升应用性能的手段中,Kotlin语言提供的协程概念因其轻量级线程管理和异步编程能力而受到广泛关注。本文将深入探讨Kotlin协程在Android开发中的应用,以及它如何帮助开发者构建出更高效、响应更快的应用,同时保持代码的简洁性和可读性。
|
4月前
|
移动开发 数据库 Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第29天】 随着移动开发技术的不断进步,开发者寻求更高效、更简洁的方式来编写代码。在Android平台上,Kotlin语言凭借其现代化的特性和对协程的原生支持,成为提高开发效率的关键。本文将深入分析Kotlin协程的核心优势,并通过实例展示如何在Android应用开发中有效地利用协程来处理异步任务,优化性能,以及提升用户体验。通过对比传统线程和回调机制,我们将揭示协程如何简化异步编程模型,并减少内存消耗,使应用更加健壮和可维护。
|
4月前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【5月更文挑战第29天】 在移动开发领域,性能优化一直是开发者追求的关键目标。随着Kotlin在Android开发中的普及,了解其与传统Java语言在性能方面的差异成为一项重要议题。本文通过深入分析和对比两种语言的运行效率、启动时间以及内存消耗,为开发者在选择编程语言时提供数据支持和实践指南,从而帮助他们构建更加高效的Android应用。