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