android 19 activity纵横屏切换的数据保存与恢复

Bundle类:竖屏的activity换到横屏的activity的时候,会把竖屏的activity杀掉横屏的activity创建,竖屏的activity会有一些计算结果,可以用数据存起来,存到内存里面,然后存在横屏的activity。
Intent类putExtra("user", user);传数据的时候用的就是Bundle对象, private Bundle mExtras;
Bundle是一个map,
package com.sxt.day04_03;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {
    String mUsers;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("main","onCreate()");
        if(savedInstanceState==null){// 若是第一次创建MainActivity为空
            //从服务端下载users.json文件
            downloadUsers();
        }else{//
            mUsers=savedInstanceState.getString("users");
            Log.i("main",mUsers);
        }
    }

    //从服务端下载users.json文件
    private void downloadUsers() {
        new Thread(){//sdk从4.0开始要求下载数据必须在工作线程中执行不能在主线程执行
            public void run() {
                InputStream in =null;
                try {
                    URL url=new URL("http://10.0.2.2/users.json");
                    URLConnection conn = url.openConnection();
                    in = conn.getInputStream();//创建输入流
                    byte[] buffer=new byte[1024];//json文件不到1k,如果很大则每次读取10k,一次一次的读。
                    int len = in.read(buffer);
                    mUsers=new String(buffer, 0, len);
                    Log.i("main",mUsers);
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }finally{
                    if(in!=null){
                        try {
                            in.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
        }.start();
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("main","onStart()");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("main","onResume()");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("main", "onPause()");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("main","onStop()");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("main","onDestroy()");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("main","onRestatr()");
    }

    @Override   //保存activity状态数据,数据在内存中,Bundle类型存着
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i("main","onSaveInstanceState()");
        outState.putString("users", mUsers);
    }

    @Override  //恢复内存中的数据
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.i("main","onRestoreInstanceState()");
    }
}

onSaveInstanceState和onRestoreInstanceState触发的时机

当某个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方法中做数据还原。 
时间: 2024-12-22 17:03:22

android 19 activity纵横屏切换的数据保存与恢复的相关文章

ios开发——实用技术篇&数据保存于恢复

数据保存于恢复 用户操作(输入数据)之后,应用程序退出并且终止之后,当用户再次打开应用的时候还是保持原来的状态 一:在storyBoard中设置恢复标志符 二:在AppDalegate中代理方法 1 -(BOOL) application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder 2 { 3 return YES; 4 } 5 6 -(BOOL) application:(UIApplicat

[Android] 强制activity的横屏与纵屏

1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.sowsceo.rnadomsows"> 4 5 <application 6 android:allowBackup="true&qu

Android总结 - Activity任务和返回栈、保存Activity的状态

任务和返回栈 一个应用程序当中通常都会包含很多个Activity,每个Activity都应该设计成为一个具有特定的功能,并且可以让用户进行操作的组件.另外,Activity之间还应该是可以相互启动的.比如,一个邮件应用中可能会包含一个用于展示邮件列表的Activity,而当用户点击了其中某一封邮件的时候,就会打开另外一个Activity来显示该封邮件的具体内容. 除此之外,一个Activity甚至还可以去启动其它应用程序当中的Activity.打个比方,如果你的应用希望去发送一封邮件,你就可以定

Android中activity之间如何传递Hashmap数据

我的使用场景是当一个页面需页面中的listview中的hashmap的数据时要另一个,就要用到了传递hashmap数据. 在发送方,我的代码是这样的: package cn.oddcloud.www.coffeestore.Test; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View;

android的Activity横竖屏切换时的生命周期

OnCreate()->OnStart->OnResume()->onPause()->onDestory->OnCreate()->OnStart->OnResume() 想要避免这种情况:要在manifest文件里面配置onconfigChanged属性 OnCreate:对象创建完毕,但此时不可见 OnStart: Activity在屏幕可见,但是此时没有焦点 OnResume:Activity在屏幕可见,并且获得焦点 onPause:Activity在屏幕

Android客户端项目全局异常处理和服务器数据保存

爱生活,爱Android!相信每一个Android开发人员都喜爱自己的工作,每天不停的生产代码,不停的解决Bug, 乐在其中,不断的学习,不断的总结,我们应该积累出自己写代码的良好习惯,慢慢的,我们就会固定出完全属于 自己的东西,下面是自己写项目时,碰到的一个问题,跟大家分享一下,有见解不到之处,还请大家指教,谢谢! 大家都知道,Android是基于Java的,本身会产生很多我们写代码时预料不到的异常,而每一个异常都很可能 导致我们的程序崩溃,比如最常见的NullException.ClassC

android开发之activity横竖屏切换时的生命周期以及横竖屏切换时的资源适配方案

背景:之前有过两篇写activity的博客 android之activity的生命周期详解:详细介绍了activity的整个生命周期.各状态间的转换和返回桌面时保存activity的状态 android之activity中onSaveInstanceState和onRestoreInstanceState的触发时机:介绍了activity中这两个方法的触发时机和作用 本篇博客会牵扯到里面的内容,如果你都有所了解可以直接往下看,如果不了解可以进去回忆下. 问题:在做应用的退出对话框时,发现如果对话

【转】android笔记--保存和恢复activity的状态数据

一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会得到保留. 但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 如果之后这个activity重新回到前台, 之前所作的改变就会消失. 为了避免此种情况的发生, 开发者可以覆写onSaveIn

Android 保存和恢复activity的状态数据

一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会得到保留. 但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 如果之后这个activity重新回到前台, 之前所作的改变就会消失. 为了避免此种情况的发生, 开发者可以覆写onSaveIn