使用onStop()和onResume()的问题

时间:2017-11-19 17:35:35

标签: android android-activity boolean android-lifecycle

我正在使用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。如果我使用BACK按钮离开活动,则只会出现此问题。如果我按回家,事情似乎工作正常(即如果布尔值为TRUE,则onResume()将其检索为TRUE。

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

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

4 个答案:

答案 0 :(得分:1)

这里有两个问题。

  1. 在活动销毁期间保存值的正确方法是使用onSaveInstanceState(Bundle)并将Bundle中的值传递给onCreate(Bundle)
  2. 检查以下示例:

    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。这意味着完全消失了。保存的值一个上面说明的方法就不存在了。
    2. 保存某些内容以使活动完成后的方法是将其保存到磁盘。一种常见/简单的方法是使用SharedPreferences

答案 1 :(得分:0)

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

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

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

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

在第二种情况下,当您按下主页按钮时,将调用以下方法 onPause(); onStop(); 这意味着您的应用程序不会被完全销毁,您可以从最近的应用程序中打开它,以便通过调用重新显示该活动 onStart(); onStop(); 这就是为什么你的代码适用于这种情况。

Activity提供onSavedInstanceState()方法在配置更改期间保存您的数据或其他内容。

以下是Android文档的链接 Activity

答案 2 :(得分:0)

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

答案 3 :(得分:0)

OP的代码基本上是正确的。如果您不破坏活动,但是例如将活动中的一个片段替换为另一个片段然后返回该片段,则onSavedInstanceState不好,在这种情况下,您必须使用onStop和{{ 1}},如下所示。这是Kotlin,并且有效,但原理相同。

onResume

我的Java有点生锈,但是我怀疑OP的问题可能是他混淆了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") } } boolean