Второй экземпляр активности после изменения ориентации

У меня странное поведение в моем приложении при изменении ориентации.

Нормальное поведение:
Когда я открываю приложение, начинается моя домашняя активность. Когда я перехожу к следующей активности (галерее), она запускается нормально (с скользящей анимацией справа налево). Когда я возвращаюсь назад с помощью клавиши «Назад», текущее действие (галерея) завершается (с выдвижной анимацией слева направо).

Странное поведение:

  • Когда я запускаю приложение в портретном режиме и меняю ориентацию на альбомную. Затем есть что-то вроде второго экземпляра домашней активности. Потому что тогда нажатие кнопки «Назад» в ландшафтном режиме не закрывает приложение, как если бы оно было без изменения ориентации (домашнее действие — это первое действие в моем приложении), а скорее создает скользящую анимацию слева направо (например, запуск нового действия) и снова показывает домашнюю активность (но я думаю другой экземпляр). Повторное нажатие кнопки «Назад» закрывает приложение.
  • Когда я запускаю приложение в ландшафтном режиме и меняю ориентацию на портретный режим, нажатие кнопки «Назад» приводит к слайд-анимации справа налево (например, закрытие действия) и снова показывает домашнее действие.
  • Когда я запускаю приложение и делаю две смены ориентации портрет-пейзаж-портрет, кнопка «Назад» закрывает приложение, как и должно быть.

Таким образом, альбомный и портретный режимы рассматриваются как два разных действия.

Я не использую android:configChanges="orientation|keyboardHidden|screenSize", поэтому изменение ориентации должно следовать нормальному жизненному циклу активности Android и уничтожать "старую" портретную (или альбомную) версию активность.
Мои действия наследуются от FragmentActivity. Я использую onSaveInstanceState для передачи parceable (который не содержит никакой ссылки на действие), и я использую onRetainCustomNonConfigurationInstance (читать здесь) для передачи несколько AsyncTask. Но все ссылки в этих задачах (если они есть) уничтожаются в onRetainCustomNonConfigurationInstance и восстанавливаются (со вновь созданной активностью) после getLastCustomNonConfigurationInstance.

Есть идеи, что могло вызвать такое поведение?

РЕДАКТИРОВАТЬ:
Объявление активности в файле манифеста:

HomeСмартфон расширяет Home
Главная расширяет MyFragmentActivity
MyFragmentActivity расширяет android.support.v4.app.FragmentActivity

В MyFragmentActivity я просто делаю кое-какие записи/отслеживание в onCreate, onRestart, onStart, onSaveInstanceState, onPause, onResume, onStop, onDestroy, вызывая некоторые статические методы класса отслеживания, который просто содержит ссылку на контекст приложения. Не в контексте деятельности.

Home — это абстрактный класс, расширенный HomeSmartphone и HomeTablet. Эти два класса выполняют специальную загрузку/обновление/инициализацию в разных макетах.

Большая часть задач выполняется в абстрактном классе Home.



    public HomeRetainedObjects retained = new HomeRetainedObjects();

    public boolean adIsShown = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.home);

        Log.i("DEBUG", "onCreate(Home)");

        if (savedInstanceState != null) {
            this.adIsShown = savedInstanceState.getBoolean("adIsShown");
        }

    // write/update values in shared preferences
        this.initPreferences();

    // recover retained objects (mostly AsyncTasks)
        this.recoverRetained();

    // show content / refresh content
        this.init();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putBoolean("adIsShown", this.adIsShown);

        Log.i("DEBUG", "onSaveInstanceState(Home)");
    }

    public void recoverRetained() {
        Object retained = this.getLastCustomNonConfigurationInstance();
        if (retained instanceof HomeRetainedObjects) {
            this.retained = (HomeRetainedObjects) retained;

            if (this.retained.loadMessageTask != null) {
                this.retained.loadMessageTask.restoreContext(this);
            }
        }
    }

    @Override
    public Object onRetainCustomNonConfigurationInstance() {
        if (this.retained.loadMessageTask != null) {
            this.retained.loadMessageTask.destroyContext();
        }

        return this.retained;
    }

Надеюсь, это поможет?!

6
задан Christian 7 March 2012 в 14:19
поделиться