美文网首页常用汇总android源码
Android 进阶之 Activity 难点

Android 进阶之 Activity 难点

作者: Kevin_小飞象 | 来源:发表于2019-04-03 10:17 被阅读6次

    难点一: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"
    

    相关文章

      网友评论

        本文标题:Android 进阶之 Activity 难点

        本文链接:https://www.haomeiwen.com/subject/xtcabqtx.html