文档章节

android onSaveInstanceState

Jonson
 Jonson
发布于 2014/04/16 09:37
字数 1015
阅读 69
收藏 0

  

   无意中留意到 onCreate(Bundle savedInstanceState) ,savedInstanceState究竟是什么,于是上网搜了搜 

   当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。
注意上面的双引号,何为“容易”?言下之意就是该activity还没有被销毁,而仅仅是一种可能性。这种可能性有哪些?通过重写一个 activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我 们可以清楚地知道当某个activity(假定为activity A)显示在当前task的最上层时,其onSaveInstanceState方法会在什么时候被执行,有这么几种情况:
1、当用户按下HOME键时。
这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则
2、长按HOME键,选择运行其他的程序时。
3、按下电源按键(关闭屏幕显示)时。
4、从activity A中启动一个新的activity时。
5、屏幕方向切换时,例如从竖屏切换到横屏时。

在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行。
总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。
至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState 方法和onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState被调用的前提 是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行。
另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。


转载于: http://gundumw100.iteye.com/blog/1115080


例子:


      Activity里的onSaveInstanceState()方法,虽然系统会自动调用它来保存Activity的一些数据,但当除它默认要保存的数据外,我们还要保存一些其他数据的时候, 我们就需要覆盖onSaveInstanceState()方法来保存Activity的附件信息。例如在播放视频过程中,横竖屏切换要保持当前播放时间进度,在默认情况下播放时间是不被自动保存的。

写了一个简单的播放视频的例子,在横竖屏切换时保持当前播放进度,效果图:

image

横屏切换:

image

mian.xml的代码:

[html] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>  

  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  

  3.     android:orientation="vertical" android:layout_width="fill_parent"  

  4.     android:layout_height="fill_parent">  

  5.      

  6.     <VideoView android:id="@+id/myvideo"   android:layout_width="wrap_content"  

  7.               android:layout_height="wrap_content" />  

  8. </LinearLayout>  

MainAcrtivity主要代码部分:

[java] view plaincopy

  1. private VideoView videoView;  

  2. private static final String VIDEO_PATH = Environment  

  3.         .getExternalStorageDirectory()  

  4.         + File.separator  

  5.         + "mymovie"  

  6.         + File.separator + "shenghuaweiji.mp4";  

  7.   

  8. /** Called when the activity is first created. */  

  9. @Override  

  10. public void onCreate(Bundle savedInstanceState) {  

  11.     super.onCreate(savedInstanceState);  

  12.     setContentView(R.layout.main);  

  13.     Log.v("tag""onCreate");  

  14.      

  15.     if (videoView == null) {  

  16.         videoView = (VideoView) this.findViewById(R.id.myvideo);  

  17.         MediaController controller = new MediaController(this);  

  18.         videoView.setMediaController(controller);  

  19.         videoView.setVideoPath(VIDEO_PATH);  

  20.         videoView.requestFocus();  

  21.     }  

  22.   

  23.     if (savedInstanceState != null  

  24.             && savedInstanceState.getInt("currentposition") != 0) {  

  25.   

  26.         videoView.seekTo(savedInstanceState.getInt("currentposition"));  

  27.     }  

  28.     videoView.start();  

  29.   

  30. }  

onCreate方法中的参数savedInstanceState就是保存的Activity一些状态。

[java] view plaincopy

  1. savedInstanceState.getInt("currentposition")  

获取视频播放时间。

实现并覆盖了onSaveInstanceState方法:

[java] view plaincopy

  1. @Override  

  2. protected void onSaveInstanceState(Bundle outState) {  

  3.     // TODO Auto-generated method stub  

  4.     outState.putInt("currentposition", videoView.getCurrentPosition());  

  5.     Log.v("tag""onSaveInstanceState");  

  6.     super.onSaveInstanceState(outState);  

  7. }   

红色代码是将当前video的播放时间存储在Bundle中。

这样在横竖屏切换时保证了播放状态,源代码:http://bigcateasymorse.googlecode.com/svn/trunk/save-activity-state1.0/







© 著作权归作者所有

共有 人打赏支持
Jonson
粉丝 21
博文 131
码字总数 17942
作品 0
肇庆
私信 提问
onSaveInstanceState和onRestoreInstanceState

本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceState(),并且在介绍这两个方法之后,再分别来实现使用InstanceState保存和恢复数据功能、 Andr...

枫兮兮
2014/02/25
0
0
Android开发之InstanceState详解

本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState和onRestoreInstanceState。 关于这两个方法,一些朋友可能在Android开发很少用到,但在有时候掌握其用法会帮我们起到比较...

带梦想一7飞
2012/08/17
0
0
Android InstanceState详解

一、onSaveInstanceState 1. 代码示例: 当屏幕的方向发生了改变, Activity会被摧毁并且被重新创建,如果你想在Activity被摧毁前缓存一些数据,并且在Activity被重新创建后恢复缓存的数据。...

恰同学少年
2015/07/27
0
0
关于Activity的onSaveInstanceSate()这个API

关于onSaveInstanceSate()这个API 参考:https://developer.android.com/reference/android/app/Activity#onSaveInstanceState(android.os.Bundle) Called to retrieve per-instance state fr......

-___-
09/13
0
0
Android onSaveInstanceState和onRestoreInstanceState触发的时机

先看Application Fundamentals上的一段话: Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling......

鉴客
2011/12/19
330
1

没有更多内容

加载失败,请刷新页面

加载更多

崛起于Springboot2.X之集成工作流Activiti5.22(42)

声明:该博客主要是Springboot1.X和Springboot2.X集成Activiti5.22版本,并说一下两个版本的搭建不同的地方 技术:Springboot2.0.3+mysql+jpa(自动生成25张表)+Activiti5.22 /然后Springboo...

木九天
7分钟前
0
1
windows环境下搭建rabbitMQ开发环境

windows环境下搭建rabbitMQ开发环境 下载与安装 erlang rabbitmq 是使用erlang语言开发的,所以需要erlang环境; 下载地址 rabbitmq 下载地址 rabbitmq与erlang版本关系 下载之后直接安装即可...

晨猫
18分钟前
0
0
JVM 中的守护线程

特点 通常由JVM启动 运行在后台处理任务,比如垃圾回收等 用户启动线程执行结束或者JVM结束时,会等待所有的非守护线程执行结束,但是不会因为守护线程的存在而影响关闭。 判断线程是否为守护...

小刀爱编程
22分钟前
1
0

参考 极客时间《数据结构与算法之美》

grace_233
34分钟前
2
0
谈谈KMP算法

KMP算法的资料网上已经一大把了,主要用来解决某个文本片段是否包含另一个子串问题。这里假设文本片段的长度n大于子串长度m,如: 文本串为ABCDABGHIJK 子串为 ABCDABE 在传统的暴力解法中当...

FAT_mt
36分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部