【问题标题】:Issue in using onStop() and onResume()使用 onStop() 和 onResume() 的问题
【发布时间】:2017-11-19 17:35:35
【问题描述】:

我正在使用 onStop() 保存活动恢复时需要的布尔值。

这是我的代码:

@Override
protected void onStop()
{
    super.onStop();

    Bundle bundle = new Bundle();
    bundle.putBoolean("value",value);
    getIntent().putExtras(bundle);

}

@Override
protected void onResume()
{
    super.onResume();

    if(getIntent().getExtras() != null)
    {
        Bundle bundle = getIntent().getExtras();
        value = bundle.getBoolean("value");
    }



}

我的问题是无论布尔值是什么,我的 onResume() 总是将其检索为 FALSE。仅当我使用“返回”按钮离开活动时才会出现此问题。如果我按回家,一切似乎都很好(即如果布尔值为 TRUE,则 onResume() 将其检索为 TRUE。

请帮帮我,因为我不明白为什么 onResume() 总是将布尔值的值设为 FALSE,即使我在 onStop() 中将它保存为 TRUE。

我也尝试了 onRestart()、onPause() 和 onBackPressed(),但我仍然无法获得要保存的正确布尔值。

【问题讨论】:

    标签: android android-activity boolean android-lifecycle


    【解决方案1】:

    这里有两个问题。

    1. 在活动销毁期间保存值的正确方法是使用onSaveInstanceState(Bundle) 并从传递给onCreate(Bundle) 的Bundle 中获取值。

    查看以下示例:

    public class SavedInstanceExample extends AppCompatActivity {
    
        private boolean myBoolean;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_savded_instace_example);
    
            if (savedInstanceState != null) {
                myBoolean = savedInstanceState.getBoolean("key");
            }
    
        }
    
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putBoolean("key", myBoolean);
        }
    }
    
    1. 当您按下返回按钮时,活动将是finished。这意味着完全消失了。并且使用上述方法保存的值将不存在。

    保存一些东西以在 Activity 完成后继续存在的方法是将其保存到磁盘上。一种常见/简单的方法是使用SharedPreferences

    【讨论】:

    • 你能举个第1点的例子吗。因为我尝试使用 onSaveInstanceState 和 onRestoreInstanceState 也没有用。
    • 这是一个通过将状态保存在 Bundle 中来处理屏幕旋转的示例 - stackoverflow.com/q/47345425/8199772
    • 优秀的答案@Budius
    • @MostafaOsama 我已经用一个例子编辑了答案。
    • @MostafaOsama 第二点。此方法仅用于保存因轮换或系统内存管理而导致的活动破坏的值。使用后退按钮完成活动,唯一的方法是将值保存到磁盘。
    【解决方案2】:

    当 Android 应用程序打开时,将调用以下活动生命周期方法。

    onCreate(); onStart(); onResume();

    当您按下返回按钮时,应用程序将通过调用以下方法销毁

    onPause(); onStop(); onDestroy();

    在第二种情况下,当您按下主页按钮时,将调用以下方法 onPause(); onStop(); 这意味着您的应用程序没有完全销毁,您可以从最近的应用程序中打开它,以便通过调用重新出现活动 onStart(); onStop(); 这就是您的代码在这种情况下有效的原因。

    Activity 提供onSavedInstanceState() 方法来在配置更改或其他情况下保存您的数据。

    这里是 Android 文档的链接 Activity

    【讨论】:

      【解决方案3】:

      我建议您阅读 Google Developers Link for Activity 文档。
      Google Developers Activity

      【讨论】:

        【解决方案4】:

        OP 的代码基本上是正确的。 onSavedInstanceState 如果您不销毁活动,但例如用另一个片段替换活动中的片段然后返回到它,那么onSavedInstanceState 是不好的,在这种情况下,您必须使用onStoponResume,如下所示。这是 Kotlin,它可以工作,但原理是一样的。

        override fun onStop() {
            super.onStop()
            val bundle = Bundle()
            bundle.putBoolean("BOOL", false)
            activity?.intent?.putExtras(bundle)
        }
        
        override fun onResume() {
            super.onResume()
            if (activity?.intent?.extras != null) {
                val bundle = activity?.intent?.extras
                val bool = bundle?.getBoolean("BOOL")
                println("BOOL is $bool")
            }
        }
        

        我的 Java 有点生疏,但我怀疑 OP 的问题可能是他混淆了 booleanBoolean

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-29
          • 1970-01-01
          • 2023-03-13
          相关资源
          最近更新 更多