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