zoukankan      html  css  js  c++  java
  • Android基础部分再学习---activity的状态保存

    主要是bundle   这个參数

    參考地址:http://blog.csdn.net/lonelyroamer/article/details/18715975

    学习Activity的生命周期,我们知道,当Activity进入到paused或者stopped状态后,这个Activity的状态仍然保存着。

    由于这个Activity对象仍然保存在内存中。它的全部信息和状态仍然是存在的。当这个Activity再次返回到前台是,它仍然保持着离开时候的样子。

    然而。假设Activity进入到了后台。系统为了回收内存,有可能会去销毁该Activity,那么。当用户通过导航返回的时候。系统就不能简单的去恢复这个Activity,而是会又一次创建这个Activity对象。可是对于普通用户来说,他并不知道系统销毁了Activity并又一次创建它,因此,可能希望该Activity保存和他离开时候一样的状态。

    在这样的情况下,您能够通过回调方法onSaveInstanceState()来保存Activity的一些重要信息,并通过onCreate()或者onRestoreInstanceState()回调方法来恢复这些信息。

    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. @Override  
    2. protected void onSaveInstanceState(Bundle outState) {  
    3.     super.onSaveInstanceState(outState);  
    4.     Log.d("roamer""onSaveInstanceState");  
    5. }  
    6.   
    7. @Override  
    8. protected void onCreate(Bundle savedInstanceState) {  
    9.     super.onCreate(savedInstanceState);  
    10.     setContentView(R.layout.activity_main);  
    11.     Log.d("roamer""onCreate");  
    12. }  
    13.   
    14. @Override  
    15. protected void onRestoreInstanceState(Bundle savedInstanceState) {  
    16.     super.onRestoreInstanceState(savedInstanceState);  
    17.     Log.d("roamer""onRestoreInstanceState");  
    18. }  


    通过onSaveInstanceState()方法传递进来的Bundle对象中,存入我们想要保存的东西。然后。当Activity被又一次创建的时候。我们就能够通过onCreate()或者onRestoreInstanceState()方法的Bundle对象。来获得我们之前存入的数据。至于Bundle的使用方法,就不多说了。

    步骤例如以下图:



    注意:并非每一次Activity销毁。系统都回去回调onSaveInstanceState()方法,我们是我们自己finish掉该Activity,那么onSaveInstanceState()方法就不会被调用。

    而且系统调用onSaveInstanceState()方法的时机通常是在onStop()之前,可是也有可能是onPause之前。

    而且系统调用onRestoreInstanceState()的时机。是在onStart()之后,onResume之前。


    Activity状态保存的默认机制

    然而。即使我们不重写onSaveInstanceState()方法。Activity对于onSaveInstanceState()方法的默认实现。仍然会帮我们恢复某些状态。详细来说,默认的实现会帮我们调用该Activity布局中每一个View的onSaveInstanceState()方法。View中的onSaveInstanceState()方法体例如以下:
    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //View的onRestoreInstanceState()方法  
    2. //该方法同意每一个View提供自己须要保存的信息  
    3. @Override  
    4. protected void onRestoreInstanceState(Parcelable state) {  
    5.     // TODO Auto-generated method stub  
    6.     super.onRestoreInstanceState(state);  
    7. }  

    差点儿Android框架中的每个widget都适当的实现了这种方法,这样不论什么可见的UI更改活动在又一次创建时自己主动保存和恢复。

    比如,EditText部件保存用户输入的不论什么文本,CheckBox部件保存是否被选中。

    我们唯一要做的工作就是提供一个惟一的ID(android:ID属性)为每个widget保存其状态。假设一个部件没有一个ID,则系统不能保存其状态。

    当然,假设在某些特殊的情况下,你不须要某个View自己主动保存和恢复他的状态。那么你能够设置View的属性android:saveEnabled为false,或者调用setSaveEnabled()方法。

    虽然系统帮我们实现了UI组建的自己主动保存和恢复,可是有时候也须要去保存和恢复一些其它的成员变量。在这样的情况下。记得重写onSaveInstanceState()和onRestoreInstanceState()方法是。记得带上super方法的实现,由于那里就是系统UI组件自己主动保存和恢复的默认实现。

    注意:由于onSaveInstnceState()方法并非Activity销毁前一定被运行,所以你最好只保存与Activity状态相关的信息(UI状态)。你不应该去保存那些持久化的数据,那些持久化的数据应该放到onPause方法里面去运行(比方将数据存储到数据库中)。

    測试Activity状态保存的方法

    Activity调用onSaveInstanceState()方法时机还好,可是调用onRestoreInstanceState()就有点不太好控制。由于等到系统内存不够去销毁Activity也是比較难以控制的。所以我们能够用以下的办法,来測试Activity的状态保存。

    就是旋转设置。让屏幕方向变化(当然前提是你没有锁定设置的旋转功能。Activity也没有设置屏幕方向)。当屏幕方向变化时,系统为了新的屏幕配置寻找替代资源,会销毁和重建Activity。

    activity的状态保存,我们最基本的问题有三点:
    1.onSaveInstanceState这种方法什么时候被运行,由于他不是必须的,不是activity生命周期中必须的流程

    onSaveInstanceState() 仅仅有在系统即将要自己主动清理销毁Activity或Fragment前才会调用, 

    换句话说:你自己finish。他肯定不会调用的,必须是系统自己触发的,

    比方 

    1, 因为重力感应 手机从竖屏变为横屏, 

    2, 手机点击Home键和长按Home键

    3, 点击电源键锁屏时

    4, 从当前Activity跳到还有一个Activity

    5, 应用内存不足即将自己主动销毁时

    2.onSaveInstanceState他保存的数据是持有化的。还是永久性的呢
    onSaveInstanceState()  这种方法适合暂时保存一些非永久性的数据.假设要持久化保存数据,就要将操作放在onStop(), onDestroy()这些方法中去

    这样来看onSaveInstanceState()的作用就是:
    onSaveInstanceState()  适合的是当前Activity或者Fragment一旦被系统自己销毁,应用还能在这之前保存一些必要的数据, 而且用户的操作非常快又回到当前这个页面,这个时候数据并没有丢失,还能最大程度的恢复之前状态.这就是这种方法最大的意义

    3.怎么复写的问题,也就是怎么自己保存自己的数据了,使用的是bundle模式,也即是key-value模式了
    由于在android的设计中中。这个函数的基本的作用是用来保存UI状态的,如今怎么去保存一些自己的数据呢
    保存:
    @Override
    public void onSaveInstanceState(Bundle outState){
           super.onSaveInstanceState(outState);
           String content = etCon.getText().toString();
           outState.putString("inputCon", content);
    }
    取出来:
    @Override
    public void onViewStateRestored(Bundle savedInstanceState){
    <span style="white-space:pre">	</span>super.onViewStateRestored(savedInstanceState);
    <span style="white-space:pre">	</span>//恢复之前输入框的内容
    <span style="white-space:pre">	</span>if(savedInstanceState != null){
    <span style="white-space:pre">		</span>etCon.setText(savedInstanceState.getString("inputCon", ""));
    	}
    }


    状态保存基本的使用除了横竖屏切换。在 fragment替换的时候能够用来解决花屏的问题



  • 相关阅读:
    配置Log4j(非常具体)
    System.Net.WebClient.cs
    Code:获取指定汉字的首字母
    DBS:目录
    Jasper:推送 API
    Jasper-template
    Code:Base64 编码/解码
    DCloud-HTML5+:5+ App开发入门指南
    DCloud-HTML5+:barcode
    Nuget-QRCode:QRCoder
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7364548.html
Copyright © 2011-2022 走看看