【问题标题】:Android activity and fragment lifecycle issues in case of app minimization应用最小化时的 Android 活动和片段生命周期问题
【发布时间】:2014-07-07 07:31:46
【问题描述】:

我有一个带有多选列表的片段。我正在尝试保存当前在列表中检查的项目的实例,并在应用程序最小化等情况下恢复它们。

测试步骤:

  1. 到达多选列表片段。
  2. 检查一些列表项
  3. 按主页键最小化应用程序。
  4. 按下多任务按钮并选择我的应用来恢复它

以下是我正在使用的代码:

adapter = new ArrayAdapter<String>(getActivity(),
        android.R.layout.simple_list_item_multiple_choice,
        android.R.id.text1, listToShow);
list.setAdapter(adapter);

list.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    mSelectedItems.clear();
                    int count = categoryList.getCheckedItemCount();

                    SparseBooleanArray booleanArray = categoryList.getCheckedItemPositions();

                    for (int i = 0; i < count; i++) {
                            mSelectedItems.add(booleanArray.keyAt(i));
                    }

                }
            });


@Override
public void onSaveInstanceState(Bundle outState) {
        Log.d("SubcategoryselectionList", "onsavedinstancestate");
        outState.putIntegerArrayList(SELECTED_ITEM, mSelectedItems);
        super.onSaveInstanceState(outState);
    }

@Override
public void onViewStateRestored(Bundle savedInstanceState) {
    Log.d("SubcategoryselectionList", "onViewStateRestored");
    if (savedInstanceState != null) {
        if (savedInstanceState.getIntegerArrayList(SELECTED_ITEM) != null) {
            Log.d("SubcategoryselectionList", "onViewStateREstored selected items found");
            mSelectedItems = savedInstanceState
                    .getIntegerArrayList(SELECTED_ITEM);
            for (int i = 0; i < mSelectedItems.size(); i++) {
                categoryList.setItemChecked(mSelectedItems.get(i), true);
            }
        }

    }
    super.onViewStateRestored(savedInstanceState);
}

当我看到日志时,永远不会调用方法 onViewStateRestored

为了解决这个问题,我想到了使用活动生命周期并使用其方法onRestoreInstanceState() 来实现上述效果,但令人惊讶的是我看不到我添加到此方法的日志。

请有人帮助澄清在这种情况下 Activity 和 Fragment 的生命周期如何工作,以及如何以最佳方式恢复我的状态。

【问题讨论】:

    标签: android android-activity android-fragments android-lifecycle


    【解决方案1】:

    您应该在 onActivityCreated 中实现您正在查看的逻辑,您将在其中保存实例状态。

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }
    

    【讨论】:

    • onActivityCreated 如何在应用最小化生命周期中工作?
    • onActivityCreated() 为捆绑包提供您保存在onSaveInstanceState() 中的值,应该用于恢复状态..
    【解决方案2】:

    当我看到日志时,onViewStateRestored 方法永远不会 调用。

    onViewStateRestored 将在您尝试重新启动之前在 android 系统本身销毁您的片段时调用。由于您的片段在后台(在您点击主页键之后)仍然存在,因此重新启动您的应用程序(从多任务键)不会导致调用 onViewStateRestored() 方法。

    要查看此方法的实际效果,请尝试旋转您的设备(纵向 -> 横向,反之亦然),您将能够看到您的 onViewStateRestored() 日志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-14
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多