• 保存Activity的状态


    如果你想保存Activity的信息(例如,类实例的变量)而又不需要和其它的组件共享的话,你可以调用Activity的getPreferences方法,不用指定一个Preference的名字。对返回的Shared  Preference的访问只限于调用的Activity;每个Activity支持一个不命名的Shared Preference对象。
     
    下面的框架代码显示了如何使用Activity的私有Shared Preference:
     
    protected void saveActivityPreferences()
    {
    // Create or retrieve the activity preferences object.
    SharedPreferences activityPreferences = getPreferences(Activity.MODE_PRIVATE);
     
    // Retrieve an editor to modify the shared preferences.
    SharedPreferences.Editor editor = activityPreferences.edit();
     
    // Retrieve the View
    TextView myTextView = (TextView)findViewById(R.id.myTextView);
     
    // Store new primitive types in the shared preferences object.
    editor.putString(“currentTextValue”, myTextView.getText().toString());
     
    // Commit changes.
    editor.commit();
    }
     
    保存和恢复实例状态
     
    对于保存Activity实例的变量来说,Android提供了一种替代Shared Preference的特殊方法。
     
    通过重写Activity的onSaveInstanceState事件处理函数,你可以使用它的Bundle参数来保存实例的值。保存数据的方法还是使用与在Shared Preference中相同的get和put方法。在完成Bundle的修改后,将其传入父类的处理函数中,如下面的代码片段所示:
     
    private static final String TEXTVIEW_STATE_KEY = “TEXTVIEW_STATE_KEY”;
    @Override
    public void onSaveInstanceState(Bundle outState) {
    // Retrieve the View
    TextView myTextView = (TextView)findViewById(R.id.myTextView);
     
    // Save its state
    outState.putString(TEXTVIEW_STATE_KEY,
    myTextView.getText().toString());
     
    super.onSaveInstanceState(outState);
    }
     
    这个处理函数会在Activity的Active生命周期结束时触发,但仅在它不是显式地结束(即异常结束)。因此,它一般用于确保在单个用户会话中的Active生命周期间Activity状态的一致性。
     
    如果一个会话期间,应用程序被迫重启,那么,保存的Bundle会传入到onRestoreInstanceState和onCreate方法中。下面的片段显示了如何从Bundle中提取值来更新Activity实例的状态:
     
    @Override
    public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    TextView myTextView = (TextView)findViewById(R.id.myTextView);
    String text = “”;
    if (icicle != null && icicle.containsKey(TEXTVIEW_STATE_KEY))
    text = icicle.getString(TEXTVIEW_STATE_KEY);
    myTextView.setText(text);
    }
     
    有一点很重要的是,记住onSaveInstanceState仅在Activity变成非Active状态时调用,但不在调用finish来关闭它或用户按下Back按钮时调用。
     
    保存To-Do List Activity的状态
     
    目前,每一次To-Do List例子程序重新启动时,所有的to-do项都丢失了且任何在文本输入框中输入的文字也被清除了。在这个例子中,你将在会话期间保存To-Do List程序的状态。
     
    ToDoList Activity中的实例状态由三个变量组成:
     
    ? 是否一个新的Item正在添加?
     
    ? 在新的项目输入框中存在什么样的文字?
     
    ? 哪个是当前选择的项目?
     
    使用Activity默认的Shared Preference,你可以保存这些值,当Activity重启时更新UI。
     
    在本章的后面,你将学习如何使用SQLite去保存to-do项目。这个例子是第一步,演示如何通过保持Activity实例的细节来确保无瑕疵的体验。
     
    1. 添加静态的字符串用作Preference的键。
     
    private static final String TEXT_ENTRY_KEY = “TEXT_ENTRY_KEY”;
    private static final String ADDING_ITEM_KEY = “ADDING_ITEM_KEY”;
    private static final String SELECTED_INDEX_KEY = “SELECTED_INDEX_KEY”;
     
    2. 接下来,重写onPause方法。获得Activity的私有Shared Preference并得到它的Editor对象。
     
    使用第1步中创建的键,存储实例的值,包括是否一个新的项目正在添加和任何在“new item”输入框中的文本。
     
    @Override
    protected void onPause(){
    super.onPause();
     
    // Get the activity preferences object.
    SharedPreferences uiState = getPreferences(0);
     
    // Get the preferences editor.
    SharedPreferences.Editor editor = uiState.edit();
     
    // Add the UI state preference values.
    editor.putString(TEXT_ENTRY_KEY, myEditText.getText().toString());
    editor.putBoolean(ADDING_ITEM_KEY, addingNew);
     
    // Commit the preferences.
    editor.commit();
    }
     
    3. 编写一个restoreUIState方法,当程序重启时,应用在第2步中记录的实例的值。
     
    修改onCreate方法,在最后部分添加对restoreUIState方法的调用。
     
    @Override
    public void onCreate(Bundle icicle)
    {
    [ ... existing onCreate logic ... ]
    restoreUIState();
    }
     
    private void restoreUIState()
    {
    // Get the activity preferences object.
    SharedPreferences settings = getPreferences(Activity.MODE_PRIVATE);
     
    // Read the UI state values, specifying default values.
    String text = settings.getString(TEXT_ENTRY_KEY, “”);
    Boolean adding = settings.getBoolean(ADDING_ITEM_KEY, false);
     
    // Restore the UI to the previous state.
    if (adding)
    {
    addNewItem();
    myEditText.setText(text);
    }
    }
     
    4. 使用onSaveInstanceState/onRestoreInstanceState机制来记录当前选择的项目的索引。它仅在非用户显式的指令杀死应用程序时保存和应用。
     
    @Override
    public void onSaveInstanceState(Bundle outState)
    {
    outState.putInt(SELECTED_INDEX_KEY, myListView.getSelectedItemPosition());
    super.onSaveInstanceState(outState);
    }
     
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState)
    {
    int pos = -1;
    if (savedInstanceState != null)
    if (savedInstanceState.containsKey(SELECTED_INDEX_KEY))
    pos = savedInstanceState.getInt(SELECTED_INDEX_KEY, -1);
    myListView.setSelection(pos);
    }
     
    当你运行To-Do List程序时,你应该看到了在会话期间UI状态的保存。但是,它还不能保存to-do列表的项目——你将在本章的后面添加这个核心的功能。
  • 相关阅读:
    net.sf.json Maven依赖配置
    springboot 测试 出错
    PowerDesigner 中SQL文件、数据库表反向生成PDM
    魔板问题(搜索)
    九宫重排(搜索)
    选点(树的遍历)
    【搜索】桐桐的运输方案
    细胞(搜索)
    传球游戏(dp)
    脚本_检测mysql存活状态
  • 原文地址:https://www.cnblogs.com/top5/p/2439576.html
Copyright © 2020-2023  润新知