zoukankan      html  css  js  c++  java
  • Android-管理Activity生命周期 -重新创建Activity

    按照正常的app行为,很少情况下activity会销毁,只有当用户点击了返回按钮或者activity通过调用finish()发出销毁信号。系统也有可能销毁activity如果它是停止状态并且很久没有使用,或者前台的activity需要更多的资源时系统不得不关掉后台进程来获得内存。

    当activity销毁了因为用户点击的返回按钮或者自己结束,系统认为这个activity永远的消失了因为这个activity实例不再需要了。但是,如果时因为系统原因销毁了activity(不是app正常的行为),这个时候虽然activity实例不存在了,但是系统会记住它存在过,也就是说当用户回到这个activity时,系统会用这个activity销毁时保存的状态信息创建一个新的实例。系统用来用来恢复以前状态的数据叫做"instance state",它是Bundle对象中一系列的键值对。

    注意:activity在每次旋转屏幕时每次都会销毁和重建。当屏幕旋转方向时,屏幕的配置变了而且activity可能需要重新加载资源(比如布局)所以系统西药销毁然后重建前台的activity。

    默认情况下,系统使用Bundle来保存activity每个view对象的信息(比如EditText对象中的文字)。所以,如果activity实例被销毁然后重建,不需要写代码就可以让布局恢复到以前的状态。但是,activity可能有更多你想要恢复的信息,比如activity中跟踪用户行为的成员变量。

    注意:为了让Android系统能够恢复activity中view的状态,每个view都要有一个唯一的ID,就是android:id属性。

    为了存储其他的activity状态,你可以重写onSaveInstanceState()方法。系统在离开activity时会调用这个方法然后传给Bundle对象,Bundle对象会在activity销毁时存储下来。如果后来系统需要重建activity,它会把一个同样的Bundle对象传递给onRestoreInstanceState()和onCreate()方法。

    图2.当系统开始停止activity时,会调用onSaveInstanceState(),这样你可以自定义其他你想存储的数据在activity重建时使用。如果activity被销毁了然后又需要重建,系统会把刚才存储的数据传递给onCreate()和onRestoreInstanceState()方法。

    保存Activity状态

    当activity将要停止时,系统会调用onSaveInstanceState()来让activity把状态信息保存到键值对中。这个方法的默认实现保存了activity的view层次结构的信息,比如EditText中的文字,ListView的滑动位置。

    为了保存activity的其他信息,你可以实现onSaveInstanceState()然后把信息以键值对的形式存到Bundle对象中,例如:

    static final String STATE_SCORE = "playerScore";
    static final String STATE_LEVEL = "playerLevel";
    ...
                                       
    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        // Save the user's current game state
        savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
        savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
                                           
        // Always call the superclass so it can save the view hierarchy state
        super.onSaveInstanceState(savedInstanceState);
    }

    注意:一定要调用父类的onSaveInstanceState()这样默认的实现才能保存view的层次结构信息

    恢复Activity状态

    当activity在销毁之后重建时,可以用系统传过来的Bundle来恢复你之前保存的状态。onCreate()onRestoreInstanceState()会收到同样的保函状态信息的Bundle。

    因为onCreate()方法在新创建activity实例和重建的时候都会调用,所以在读Bundle之前要判断一下是否为空。如果是空,系统是在创建一个新的activity实例,如果不是,就是在重建之前销毁的。

    例如,下面是如何在onCreate()中恢复状态:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); // Always call the superclass first
                                 
        // 查看是不是在重建以前销毁的实例
        if (savedInstanceState != null) {
            // 恢复保存的成员变量
            mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
            mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
        } else {
            //这里可能是为新的实例初始化默认值
        }
        ...
    }

    除了在onCreate()中恢复状态,也可以选择实现onRestoreInstanceState(),系统会在onStart()之后调用onRestoreInstanceState().系统只有在有保存的数据需要恢复时才调用onRestoreInstanceState(),所以不需要检查Bundle是否为空:

    public void onRestoreInstanceState(Bundle savedInstanceState) {
        // Always call the superclass so it can restore the view hierarchy
        super.onRestoreInstanceState(savedInstanceState);
                              
        // 从保存的实例中恢复状态信息
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    }

    注意:一定要调用父类的onRestoreInstanceState()这样默认的实现才能恢复view的层次结构信息。

    如果要学习更多关于重建activity的信息(比如runtime相关,屏幕旋转)可以查看handling Runtime Changes.

    上一篇:Android-管理Activity生命周期 -停止和重启Activity

  • 相关阅读:
    Bootstrap 4 网格的基本结构
    Js 框架之Vue .JS学习记录 ① 与Vue 初识
    ASP.NET 发送邮件 SMTP
    c# 多线程简化
    ASP.NET Razor
    ASP.NET MVC 简单介绍①
    握手7
    握手6
    握手5
    握手4
  • 原文地址:https://www.cnblogs.com/fengquanwang/p/3142389.html
Copyright © 2011-2022 走看看