Android青年大学习

Android学习之 Activity的意外销毁重建

2023-12-05  本文已影响0人  _汉堡_

问题:savedInstanceState 是什么 怎么用

先说答案:
saveInstanceState 是一个 Bundle 对象,它提供了一种在 Activity 实例被意外销毁和重建时保存和恢复 Activity 状态的方式。

使用 savedInstanceState 的场景:

屏幕方向改变:
当设备旋转时,Activity默认会被销毁并重建,savedInstanceState可以保存数据,然后在新实例中恢复。
内存回收:
系统为了回收资源可能会销毁后台Activity,savedInstanceState用于这种情况下保存状态。
多窗口模式:
当用户在多窗口模式下调整Activity大小,可能会触发重新创建Activity。

怎么实现状态保存和恢复:
保存状态
重写 onSaveInstanceState(Bundle outState) 方法,将需要保存的状态信息以键值对形式放入 Bundle 中。
@Override

protected void onSaveInstanceState(Bundle outState) {

    super.onSaveInstanceState(outState);

    // 保存用户的当前状态

    outState.putInt("SCORE", currentScore);

    outState.putString("PLAYER_NAME", playerName);

}

恢复状态
在 onCreate(Bundle savedInstanceState) 或 onRestoreInstanceState(Bundle savedInstanceState) 中恢复状态。
@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    //检查我们是否正在重新创建以前销毁的实例

    if (savedInstanceState != null) {

        // 从保存的状态恢复成员的值

        currentScore = savedInstanceState.getInt("SCORE");

        playerName = savedInstanceState.getString("PLAYER_NAME");

    } else {

        // 可能使用新实例的默认值初始化成员

    }

}

注意点:
只有在 Activity 被系统销毁并重建的情况下,savedInstanceState 才会非空。用户主动退出 Activity 时,例如按下返回键,通常不会调用 onSaveInstanceState,因为此时认为用户可能不需要恢复之前的状态。

savedInstanceState 不适用于持久化数据,它更适合用于短暂保存界面状态。对于需要长期保存的数据,应使用文件存储、SharedPreferences 或数据库等方式。

大量数据不宜存入 savedInstanceState,因为 Bundle 容量有限,存入过多数据可能会导致 TransactionTooLargeException 异常。对于大量数据的保存,应该考虑其他持久化存储方案。

上一篇下一篇

猜你喜欢

热点阅读