Training--重建一个Activity

本文深入探讨了Android应用中Activity的生命周期管理,详细解释了Activity在不同场景下的销毁与重建过程,并阐述了如何利用Bundle对象保存和恢复实例状态,确保用户界面的一致性和连续性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重建一个Activity

 

在正常的app行为中,有几个场景你的activity会被销毁,例如点击了后退按钮或者你自己调用了finish()来销毁自己。系统也可能销毁你的activity,例如activity处于停止状态并且长时间未使用或者前台的activity需要更多的系统资源,系统迫不得已需要关闭后台的进程来回收内存。

 

当你的activity的销毁是通过用户点击后退或者自己结束自己的时候,对于系统来说这个activity实例将永远消失,因为这些行为被认为是这些activity不再被需要。但是,如果系统销毁某个activity是由于系统一些限制(而不是正常的app行为),那么尽管这个activity实例消失了,系统仍然会记住它存在过,这样当用户再次返回到这个activity的时候,系统会使用一个保存了销毁之前的状态的对象来创建一个新的activity实例。这个被保存的对象称为Bundle对象,里面保存了一系列键值对数据,这一系列数据被称为“实例状态”。

 

警告:当用户每次旋转屏幕的时候,你的activity都会被销毁和重建。当屏幕改变方向的时候,系统就会销毁和重建前台的activity,因为屏幕的配置信息发生变化了,你的activity可能需要重新加载一些可选资源(例如一个布局)。

 

默认情况下,系统会使用Bundle实例来保存你的activity布局中的每一个view的信息(例如EditText中输入的文本)。所以,如果你的activity实例被销毁然后重建,布局的状态会被恢复到以前状态而不需要你额外编码。尽管如此,你可能想恢复activity需要的其他信息,例如使用一个变量追踪用户在activity中的操作进度。

 

注意:为了使安卓系统能够恢复activity中的每一个view的状态,每一个view必须有一个唯一的ID,由android:id属性提供。

 

为了保存额外的activity状态数据,你必须重写onSaveInstanceState()方法。当用户离开你的activity时,系统会调用这个方法,传入一个Bundle对象,这个对象会在activity被意外销毁的时候保存下来。如果系统必须重建这个activity,它会把这个同样的Bundle对象传递给onRestoreInstanceState()和onCreate()方法。

 

Figure 2. 当系统准备停止你的activity, 它会调用 onSaveInstanceState() (1) 你可以保存你想保存的状态数据,以供activity实例必须被重建的时候使用. 如果activity被销毁了,且同一个activity必须被重建, 系统会把 (1)中保存的数据传递给 onCreate()方法(2) onRestoreInstanceState() 方法(3).

 

保存你的activity状态

 

当你的activity准备停止的时候,系统会调用onSaveInstanceState(),所以你可以使用一些键值对来保存状态信息。这个方法的默认实现会保存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) {
    // 保存用户的游戏状态
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
    
    // 总是调用基类的回调方法,这样才能保存view层次结构的状态
    super.onSaveInstanceState(savedInstanceState);
}

 

恢复你的activity状态

 

当你的activity从之前被销毁的状态中重建的时候,你可以使用系统传递过来的Bundle对象来恢复之前保存的activity状态。onCreate()和onRestoreInstanceState()方法都会收到同一个保存实例状态信息的Bundle对象。

 

无论系统是初次创建一个新的activity实例,还是重建之前的某一个activity,onCreate()方法都会被调用,所以你在读取传递进来的Bundle对象之前,一定要检查它是否为空。如果为空,说明系统是要创建一个新的activity实例,而不是重建之前被系统销毁的activity。

 

例如,下面就是一个如何在onCreate()方法中恢复状态的例子:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // 总是先调用基类的方法
   
    // 检查一下我们是否在重建之前被销毁的activity
    if (savedInstanceState != null) {
        // 从保存的数据中恢复成员变量
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // 为一个新的实例使用默认值初始化成员变量
    }
    ...
}

 

你可以不在onCreate()方法里恢复状态,而选择使用onRestoreInstanceState()方法,这个方法会在onStart()之后调用。只有当有保存的数据需要恢复时,系统才会调用onRestoreInstanceState()方法,所以你不需要检查传递进来的Bundle值是否为空:

 

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // 总是调用基类方法,这样才能恢复view层次结构的状态
    super.onRestoreInstanceState(savedInstanceState);
   
    // 从保存的实例中恢复状态变量
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值