OnCreate () вызывается при повторном открытии из недавней задачи после изменения настроек разрешения

Название вопроса может звучать сложно, но вот моя ситуация.

У меня есть фрагмент карты внутри действия. Просто. Включите разрешение на хранение, чтобы разрешить отображение карты, отлично работает. Запустите приложение, нажав кнопку «Домой», затем отключите разрешение «Хранилище» и откройте приложение из недавней задачи, сбой приложений.

Проблема заключается не в вызове функции onResume () активности хоста, а onCreate () вызывается как в Activity, так и onCreateView () фрагмента карты. Таким образом, он бросает Исключения.

Кажется, что процесс приложения убит, когда разрешение изменено и, следовательно, активность воссоздана.

09-24 14:42:55.071: E/AndroidRuntime(12918): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 09-24 14:42:55.071: E/AndroidRuntime(12918): Caused by: java.lang.NullPointerException: Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim' on a null object reference 09-24 14:42:55.071: E/AndroidRuntime(12918): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:718) 09-24 14:42:55.071: E/AndroidRuntime(12918): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489) 09-24 14:42:55.071: E/AndroidRuntime(12918): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:548) 

От super.onStart () от Activity

Solutions Collecting From Web of "OnCreate () вызывается при повторном открытии из недавней задачи после изменения настроек разрешения"

Работоспособное решение теперь – это просто вызвать getSupportFragmentManager().popBackStackImmediate(); В onCreate () Activity, чтобы предотвратить попытку воссоздать фрагмент карты.

PopBackStack () не будет работать в этом случае, поскольку он асинхронен.

Возможно, немного поздно, все равно могут помочь другим в будущем 🙂

Вы должны проверить, является ли savedInstanceState null которое передается в onCreate(Bundle savedInstanceState) . Если он null только тогда, запустите Fragment следующим образом:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_layout_file); if (savedInstanceState == null) { // do fragment transactions here } } 

У меня были похожие проблемы с динамическим изменением разрешения приложения. После того, как некоторые копать, что я понял, может быть полезно и вам.

Изменение разрешения приводит к прекращению действия приложения в системе, и теперь, если вы откроете приложение из обзорного экрана, оно перезапустит ваше приложение, что является основной причиной вашего сбоя, поскольку вы можете выполнять операцию над объектом фрагмента, которая теперь равна null ,

Важным моментом здесь является то, что до завершения фрагмента состояние сохраняется в файле savedinstance.

Чтобы остановить сбой, вы должны получить экземпляр фрагмента, используя эту строку кода –

 mapFragment = (MapFragment)getSupportFragmentManager().findFragmentByTag("MAP FRAG"); 

Здесь «MAP FRAG» – это тег, который вы должны отдать своему фрагменту.

Если у вас есть путаница.