Android 进阶之 Activity 难点

难点一:setResult() 的调用时机

从源码可以看出,Activity 返回 result 是在被 finish 的时候,也就是说调用 setResult() 方法必须在 finish() 之前。所以在 onPause()、onStop()、onDestroy() 方法中调用 setResult() 也有可能不会返回成功,因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的,但是又不满足业务需要。
两个实际使用场景:

  1. 按 BACK 键从一个 Activity 退出来的。
    方法:重写onBackPressed()方法,捕获BACK事件,捕获到之后先setResult。代码:
@Override
 public void onBackPressed()
 {
        Log.i(TAG, "onBackPressed");
        setResult(Const.LIVE_OK);
        super.onBackPressed();
 }

2.点击事件中显式的调用 finish()

setResult(RESULT_OK);
finish();

难点二:onSaveInstanceState() 保存 Activity 状态

当您的 Activity 开始停止时,系统会调用 onSaveInstanceState() 以便您的 Activity 可以使用一组键值对来保存状态信息。此方法的默认实现保存有关 Activity 视图层次结构状态的信息,例如 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);
    
    // 调用父类交给系统处理,这样系统能保存视图层次结构状态
    super.onSaveInstanceState(savedInstanceState);
}

难点三:onRestoreInstanceState() 恢复 Activity 状态

当您的 Activity 在之前被破坏后重新创建时,您可以从 Bundle 系统通过您的 Activity 中恢复您的保存状态。这两个方法 onCreate() 和 onRestoreInstanceState() 回调方法都会收到Bundle包含实例状态信息的相同方法。
因为 onCreate() 调用该方法是否系统正在创建一个新的 Activity 实例或重新创建一个以前的实例,所以您必须 Bundle 在尝试读取之前检查该状态是否为空。如果它为空,那么系统正在创建一个 Activity 的新实例,而不是恢复之前被销毁的实例。
例如:

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // 总是调用超类,以便它可以恢复视图层次超级
    super.onRestoreInstanceState(savedInstanceState);
   
    // 从已保存的实例中恢复状态成员
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

难点四:onConfigurationChanged() 常见问题解决

当系统的配置信息发生改变时,系统会调用此方法。
注意:只有在配置文件 AndroidManifest 中处理了configChanges 属性对应的设备配置,该方法才会被调用。如果发生设备配置与在配置文件中设置的不一致,则Activity会被销毁并使用新的配置重建。
例如:横竖屏切换问题。
如果 targetSdkVersion 的值大于等于 13,则如下配置才会回调 onConfigurationChanged() 方法.

android:configChanges="orientation|screenSize"

如果targetSdkVersion的值小于13,则只要如下配置就可以了。

android:configChanges="orientation"
发布了225 篇原创文章 · 获赞 64 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/duoduo_11011/article/details/103931692