zoukankan      html  css  js  c++  java
  • 【基础篇】activity生命周期及数据保存

    常见的Android 的界面,均采用Activity+view的形式显示的,一提到Activity,立即就能联想到Activity的生命周期与状态的保存。 下面先从Activity的生命周期开始说起 
    1.打开Activity:则onCreate()->onStart()->onResume() 

    2.关闭Activity:则onPause()->onStop()->onDestroy() 

    3.以上第一步打开Activity后如果按back键(即发生了退回的操作,这个时候应用程序是要关闭的,属于用户主动对Activity销毁)则onPause()->onStop()->onDestroy() 

    4.以上第一步打开Activity后如果按Home键(即访问手机系统的主菜单界面或者来电等其它原因中断了当前Activity。这个时候因为acvitity是处于不可见的状态,但是没有进行清理销毁的,只是暂停了),于是 onPause()->onStop() 

    5.以上第四步之后返回或再打开Activity,则onRestart()->onStart()->onResume()

    6. 从一个Activity调用另一个Activity的话,则在目标Activity中的onCreate(Bundle savedInstanceState )就多了一个Bundle(就是一个intent,里面包含了该Activity的创建动作和信息),将Activity按照相应的情况创建出来->onStart()->onResume() 之后操作就是一直这样循环的,所有生命周期也就是这样循环的    

    通过上面的描述,大体上知道了Activity的生命周期 

    但是,后台Activity的优先级是比较低的,当系统内存等资源不足时,将会把后台的Activity killed 掉,此时界面中的信息将会对丢失,怎么办呢? 

    Android的设计者早都为我们想好了,怎样处理避免界面信息的丢失。 

    Activity中存在两个非常重要的回调方法,onSaveInstanceState(Bundle outState) onRestoreInstanceState(Bundle savedInstanceState) 方法,那么是不是只要复写了该方法,就一定会调用呢? 答案是否定的。 

    下面下从onSaveInsatanceState(Bundle outState) 开始说起,当发生以下状态时,会出发onSaveInstanceState(Bundle outState)方法:

    1、当用户按下HOME键时。

    2、长按HOME键,选择运行其他的程序时。 

    3、按下电源按键(关闭屏幕显示)时。 

    4、从Activity A中启动一个新的Activity时。 

    5、屏幕方向切换时,例如从竖屏切换到横屏时。

    源码示例:

    public class ActivityLife extends Activity {

    // 在Activity生命周期开始时被调用
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("***", "onCreate");
    }

    // 当activity从停止状态重新启动时调用
    @Override
    protected void onRestart() {
    super.onRestart();
    Log.d("***", "onRestart");
    }

    // 当activity对用户即将可见的时候调用。
    @Override
    protected void onStart() {
    super.onStart();
    Log.d("***", "onStart");
    }

    // onCreate完成后被调用,用来恢复UI状态
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    Log.d("***", "onRestoreInstanceState");
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d("***", "onActivityResult");
    }

    // 开始与用户进行交互
    @Override
    protected void onResume() {
    super.onResume();
    Log.d("***", "onResume");
    }

    // Activity即将移出栈顶保留UI状态时调用此方法
    @Override
    protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Log.d("***", "onSaveInstanceState");
    }

    // 当系统要启动一个其他的activity时调用(其他的activity显示之前),这个方法被用来提交那些持久数据的改变、停止动画、和其他占用
    // CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快。
    @Override
    protected void onPause() {
    super.onPause();
    Log.d("***", "onPause");
    }

    // 当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。一个新activity启动、其它activity被切换至前景、当前activity被销毁时都会发生这种场景。
    @Override
    protected void onStop() {
    super.onStop();
    Log.d("***", "onStop");
    }


    @Override
    protected void onDestroy() {
    super.onDestroy();
    Log.d("***", "onDestroy");
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    Log.d("***", "onConfigurationChanged");
    }
    }

    可视过程的生命周期onStart() 直到onPause(),可交互的生命周期 onResume()onPause()

     
     保存activity状态

     当系统因为某种原因关闭了一个activity之后。用户会期望当他再次回到那个activity的时候,它仍保持着上次离开时的样子。

     保存activity状态有两种方式:

     1、onSaveInstanceState

     它会将一个Bundle对象传递给该方法。当activity再次启动时,这个Bundle会传递给onCreate()方法和随着onStart()方法调用的onRestoreInstanceState()
     所以它们两个都可以恢复捕获的状态。
     
     那么,在什么时刻会执行onSaveInstanceState方法

    1、当用户按下HOME键时。

    这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则


    2、长按HOME键,选择运行其他的程序时。


    3、按下电源按键(关闭屏幕显示)时。


    4、从activity A中启动一个新的activity时。


    5、屏幕方向切换时,例如从竖屏切换到横屏时。

    在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行

    总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。

     说到onSaveInstanceState,那么必须来看看onRestoreInstanceState方法,onRestoreInstanceState只有在Activity确实被系统回收了才会被调用,比如横竖屏切换onRestoreInstanceState就会被执行,一般来说按Home键,再去回到ActivityAcitivity一般不被系统销毁,onRestoreInstanceState也不会被调用。

     2、onPause

     因为onSaveInstanceState()不是总被调用,所以你应该只用它来为activity保存一些临时的状态,而不能用来保存持久性数据,因为可能根本保存不了,
     而是应该用onPause()来达到这个目的。

                                                    ——转载自http://my.oschina.net/helu/blog/159024

  • 相关阅读:
    BZOJ1880: [Sdoi2009]Elaxia的路线(最短路)
    「BZOJ1433」[ZJOI2009] 假期的宿舍(二分图,网络流)
    BZOJ 1061 [Noi2008]志愿者招募(费用流)
    [BZOJ2879][Noi2012]美食节(费用流)
    bzoj 1834 [ZJOI2010] network 网络扩容(费用流)
    BZOJ2668:[CQOI2012]交换棋子(费用流)
    bzoj1070【SCOI2007】修车(费用流)
    【BZOJ 1877】 [SDOI2009]晨跑(费用流)
    SQLite_Home
    GeoMesa-单机搭建
  • 原文地址:https://www.cnblogs.com/tbcxy/p/3313908.html
Copyright © 2011-2022 走看看