Второй случай активности после смены ориентации - PullRequest
6 голосов
/ 06 марта 2012

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

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

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

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

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

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

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

EDIT:
Декларация о деятельности в Manifest-файле:
<activity android:name=".activities.smartphone.HomeSmartphone" android:label="@string/app_name"></activity>

HomeSmartphone расширяет 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;
    }

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

1 Ответ

0 голосов
/ 31 августа 2012

Я столкнулся с подобной проблемой, и кажется, что причина ваших проблем заключается в переопределении onRetainCustomNonConfigurationInstance().

Я просмотрел свой объект состояния хранения и обнаружил, что он содержит ссылку на Context. Я завернул его в WeakReference, и нормальное поведение вернулось, и никаких странных двойных примеров не осталось.

Возможно, ваше состояние хранения также содержит ссылку на Context?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...