У меня странное поведение в моем приложении при смене ориентации.
Нормальное поведение:
Когда я открываю свое приложение, начинается домашняя активность. Когда я перехожу к следующему занятию (галерее), оно запускается как обычно (со вставной анимацией справа налево).
Когда я возвращаюсь с помощью клавиши «назад», текущее действие (галерея) завершается (с выдвигающейся анимацией слева направо).
Странное поведение:
- Когда я запускаю приложение в портретном режиме и меняю ориентацию на альбомную. Тогда есть что-то вроде второго случая домашней деятельности. Потому что тогда нажатие кнопки «Назад» в ландшафтном режиме не закрывает приложение, как это было бы без изменения ориентации (домашняя активность - это первое действие в моем приложении), но, скорее всего, выполняйте скользящую анимацию слева направо (например, начало нового действия) и показывает домашнюю деятельность (но я думаю, что другой случай) снова. Повторное нажатие кнопки «Назад» закрывает приложение.
- Когда я запускаю приложение в альбомном режиме и меняю ориентацию на портретный режим, нажмите, а затем кнопку «Назад» приводит к слайд-анимации справа налево (например, закрытие занятия) и снова показывает домашнее занятие.
- Когда я запускаю приложение и делаю два изменения ориентации портрет-пейзаж-портрет, кнопка «Назад» закрывает приложение, как и должно быть.
Так что пейзаж и портретный режим рассматриваются как два разных действия.
Я не использую 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;
}
Надеюсь, это поможет?!