MainActivity вызывает onDestroy при переходе вверх

У меня проблема с навигацией в моем приложении. У меня есть две активности: MainActivity и FormActivity. Основное действие имеет макет ящика, в зависимости от выбранного элемента он загружает фрагмент:

private void selectItem (int position) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();

    Fragment fragment = null;
    previousNavigationItem = position;

    switch (position)
    {
        case DASHBOARD_FRAGMENT:
            fragment = new DashboardFragment();
            mTitle = getResources().getString(R.string.title_dashboard);
            break;
        case LIST1_FRAGMENT:
            fragment = new ListFragment();
            mTitle = getResources().getString(R.string.title_list1);
            break;

        case LIST2_FRAGMENT:
            fragment = new ListFragment();
            mTitle = getResources().getString(R.string.title_list2);
            break;

        default:
            Log.w(AppController.ERROR_TAG, "Index out of bounds in changeFragment");
    }

    if (fragmentTransaction != null && fragment!=null) {
        fragment.setRetainInstance(true);
        fragmentTransaction.replace(R.id.content_frame, fragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }
}

ListFragment загружает список с несколькими строками, когда выбран один элемент, он запускает новую FormActivity:

protected void startForm(FormActivity.FORM_ACTION action, String dataClass, int groupPosition, long groupId) {
    Intent data = new Intent(getActivity(), FormActivity.class);
    data.setAction(action.toString());
    data.putExtra(FormActivity.BUNDLE_KEY_GROUP_POSITION, groupPosition);
    data.putExtra(FormActivity.BUNDLE_KEY_FORM_CLASS, dataClass);
    data.putExtra(FormActivity.BUNDLE_KEY_GROUP_ID, groupId);
    startActivityForResult(data, FormActivity.FORM_REQUEST_CODE);
}

в ФормАктивити:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_form);

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();

    Fragment fragment = null;
    try {
        (...I do some casting here but nothing to do with the problem..)
        fragment = new FormFragment();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    if (fragmentTransaction != null && fragment!=null)
        fragmentTransaction.replace(R.id.form_frame, fragment).commit();

}

Все работает так, как ожидалось, за исключением случаев, когда я возвращаюсь назад с помощью кнопки HomeUp, MainActivity уничтожается, а затем снова создается заново, а saveInstance не сохраняется.

Я прочитал всю документацию от разработчиков Android, но так и не нашел виновника.

Изменить:

В MainActivity

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    Log.d(AppController.DEBUG_TAG, "MainActivity onRestoreInstanceState");
    super.onRestoreInstanceState(savedInstanceState);
    // Restore the previously serialized current dropdown position.
    if (savedInstanceState.containsKey(STATE_SELECTED_NAVIGATION_ITEM)) {
        getSupportActionBar().setSelectedNavigationItem( savedInstanceState.getInt(STATE_SELECTED_NAVIGATION_ITEM));
    }

}

@Override
public void onSaveInstanceState(Bundle outState) {
    Log.d(AppController.DEBUG_TAG, "MainActivity onSaveInstanceState");
    super.onSaveInstanceState(outState);
    // Serialize the current dropdown position.
    outState.putInt(STATE_SELECTED_NAVIGATION_ITEM,
            getSupportActionBar().getSelectedNavigationIndex());
    Log.d(AppController.DEBUG_TAG, "Selected item id in Navigation Drawer: " + mDrawerList.getSelectedItemId());
}

person spacebiker    schedule 16.12.2013    source источник
comment
Проверь это. stackoverflow.com/a/16426803/832749   -  person Siddharth N    schedule 17.12.2013
comment
@Siddharth, спасибо за ваш ответ, я проверил параметры разработчика, и функция «Не сохранять действия» отключена.   -  person spacebiker    schedule 17.12.2013


Ответы (1)


Посмотри это:

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

По сути, в любой момент времени может происходить несколько однотипных действий.

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

РЕДАКТИРОВАТЬ:

Хорошо, я, кажется, что-то неправильно понял.

Для этого вам придется использовать SharedPreferences или какой-либо другой метод сохранения. Если Android полностью закрывает ваше приложение, то ресурсы вашего пакета saveInstance, вероятно, будут освобождены.

Общие настройки - очень стандартный способ сохранения и работает очень хорошо...

Видеть:

http://developer.android.com/guide/topics/data/data-storage.html#pref

person Nathaniel D. Waggoner    schedule 16.12.2013
comment
Я уже читал эти документы, но вопрос в том, как я могу сохранить предыдущее состояние из пакета, если пакет тоже воссоздается? Я отредактировал свой вопрос, добавив (ранее в моем коде) переопределения onRestoreInstanceState и onSaveInstanceState. - person spacebiker; 17.12.2013
comment
Ты уверен? Я не вижу здесь onSaveInstanceState. - person Nathaniel D. Waggoner; 17.12.2013
comment
только что добавленный после написания комментария, он должен быть там сейчас, если вы обновите - person spacebiker; 17.12.2013
comment
внимательно изучите: developer.android.com/reference/android/app/ Activity.html И внимательно посмотрите на диаграмму жизненного цикла... - person Nathaniel D. Waggoner; 17.12.2013
comment
Я где-то читал, что могу решить эту проблему, сохранив значения в SharedPreferences, но я хотел бы, чтобы приложение было как можно более стандартным, и я думаю, что метод SharedPreference является своего рода патчем. - person spacebiker; 17.12.2013
comment
Извините, я неправильно понял это раньше. Да, вам нужно подать в суд на sharedPreferences. Это ОЧЕНЬ стандартно и хорошо поддерживается, и будет работать при принудительном закрытии, выключении/включении телефона и т. д. - person Nathaniel D. Waggoner; 17.12.2013