【问题标题】:How to properly save and restore an activity's state?如何正确保存和恢复活动的状态?
【发布时间】:2016-07-13 03:10:32
【问题描述】:

我正在学习如何使用 Android Studio,并且正在尝试保存我的活动状态。 onSaveInstanceState 方法有问题,因为当我运行代码时,savedInstanceState 始终为空。我能做些什么来解决这个问题?我已经尝试了几个小时,但我只是看不出有什么问题。这是mainActivity文件的相关内容。

public class MainActivity extends AppCompatActivity {

    public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
    static final String LAST_MESSAGE = "com.example.myfirstapp.LAST_MESSAGE";
    String message, displayMessage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        System.out.println("Restoring");
        System.out.println(savedInstanceState);
        if (savedInstanceState != null) {
            displayMessage = "Last Saved Message: " + savedInstanceState.getString(LAST_MESSAGE);
        }
        else {
            displayMessage = "No Messages Saved!";
        }

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, displayMessage, Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        savedInstanceState.putString(LAST_MESSAGE, message);

        super.onSaveInstanceState(savedInstanceState);
    }

    public void sendMessage(View view) {
        Intent intent = new Intent(this, DisplayMessageActivity.class);
        EditText editText = (EditText) findViewById(R.id.edit_message);
        message = editText.getText().toString();
        intent.putExtra(EXTRA_MESSAGE, message);
        startActivity(intent);
    }
}

【问题讨论】:

  • 你期待有一个savedInstanceState吗?当您使用该活动startActivity 时,它不会被保存。你试过旋转屏幕吗?
  • onSaveInstanceState方法的触发方式可以参考this diagram
  • 在您的代码中,数据仅在旋转屏幕时保存。如果您想保存简单数据,您可以使用 Sharedpreference,或者如果您存储大量数据,您可以使用数据库(例如:SQLite、Realm...)保存。
  • 谢谢,我旋转了屏幕,savedInstanceState 不再为空,但似乎出现了另一个问题:我添加了一个println 语句来检查何时调用该方法。它似乎在 Activity 更改以及屏幕旋转时被调用,但 savedInstanceState 仅在屏幕旋转时更改。这是怎么回事?

标签: android


【解决方案1】:

首先,您必须了解活动生命周期。 https://developer.android.com/guide/components/activities.html

也读这个。 When are onSaveInstanceState() and onRestoreInstanceState() called, exactly?

简而言之,第一次执行活动时,savedInstanceState 应该为空。当您从任何页面返回MainActivity 时,您可能会从onRestoreInstanceState 得到一些东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2016-01-12
    相关资源
    最近更新 更多