Проблемы с активностью Android и жизненным циклом фрагментов в случае минимизации приложения

У меня есть фрагмент со списком с множественным выбором. Я пытаюсь сохранить экземпляр элементов, которые в настоящее время отмечены в списке, и восстановить их в случае минимизации приложения и тому подобного.

Этапы тестирования:

  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 в этом случае и как я могу восстановить свое состояние наилучшим образом.


person Kshitij Aggarwal    schedule 07.07.2014    source источник


Ответы (2)


Вы должны реализовать логику, которую вы ищете в onActivityCreated, где вы получаете сохраненное состояние экземпляра.

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}
person N Sharma    schedule 07.07.2014
comment
Как onActivityCreated может работать в жизненном цикле минимизации приложений? - person Kshitij Aggarwal; 08.07.2014
comment
onActivityCreated() дает пакет со значением, которое вы сохранили в onSaveInstanceState() и должны использоваться для восстановления состояния.. - person Praful Bhatnagar; 10.07.2014

И когда я вижу логи, метод onViewStateRestored никогда не вызывается.

onViewStateRestored будет вызываться, когда сама система Android уничтожит ваш фрагмент, прежде чем вы попытаетесь перезапустить его. Поскольку ваш фрагмент все еще жив, пока он находится в фоновом режиме (после того, как вы нажали домашнюю клавишу), следовательно, перезапуск вашего приложения (из клавиши многозадачности) не приведет к вызову метода onViewStateRestored().

Чтобы увидеть этот метод в действии, попробуйте повернуть свое устройство (книжная -> альбомная или наоборот), вы сможете увидеть свои журналы onViewStateRestored().

person AndoAiron    schedule 10.07.2014