9

Tytuł pytania może wydawać się skomplikowany, ale tutaj jest moja sytuacja.Funkcja onCreate() zostaje wywołana po ponownym otwarciu ostatniego zadania po zmianie ustawień uprawnień

Mam fragment mapy w ramach działania. Prosty. Włącz zezwolenie na przechowywanie, aby zezwolić na wyświetlanie mapy, działa poprawnie. Tła aplikacji, naciskając przycisk strony głównej, a następnie wyłącz uprawnienia do przechowywania i otwórz aplikację z ostatniego zadania, awarie aplikacji.

Problem polega na tym, że zamiast wywoływać funkcję Resume() działania hosta, funkcja onCreate() jest wywoływana na aktywności hosta, a także onCreateView() fragmentu mapy. Tak więc rzuca Wyjątki.

Wygląda na to, że proces aplikacji zostanie zabity po zmianie uprawnień i tym samym Aktywność zostanie odtworzona.

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) 

Od super.onStart() z działalności

+1

Metody cyklu życia nie zostały zmienione. Co się dzieje, działanie zostało zniszczone przez system. Właśnie dlatego twoja aktywność jest odtwarzana i dlaczego wywoływana jest metoda onCreate. – eddiecubed

+0

Czy mówisz, że działanie zostało zniszczone z powodu zmian uprawnień? Ponieważ funkcja onResume() jest wywoływana normalnie, metoda onCreate() jest wywoływana w przypadku zmiany uprawnień dla tego działania, w moim przypadku fragment mapy w działaniu. – WenChao

+1

Gdy pojawia się zmiana uprawnień, działanie jest zawsze niszczone. – greywolf82

Odpowiedz

0

praktycznym rozwiązaniem jest teraz po prostu zadzwonić getSupportFragmentManager().popBackStackImmediate(); w onCreate() z działalności w celu zapobieżenia z próby odtworzenia fragmentu mapy.

Funkcja popBackStack() nie będzie działać w tym przypadku, ponieważ jest asynchroniczna.

0

Prawdopodobnie nieco późno, jeszcze może pomóc innym w przyszłości :)

Należy sprawdzić, czy savedInstanceState jest null który jest przekazywany do onCreate(Bundle savedInstanceState). Jeśli to null tylko wtedy, uruchom Fragment tak:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_layout_file); 

     if (savedInstanceState == null) { 
      // do fragment transactions here 
     } 
    } 
+0

ok, ale po wywołaniu metody onCreate() wywoływana jest funkcja ondestroy(), dzięki czemu aplikacja jest zamknięta. Czy zapisana instancjaInstanceState uniemożliwi moją aplikację? – MiloRambaldi

+0

@MiloRambaldi 'savedInstanceState' zawiera informacje dotyczące ostatniego stanu aplikacji (w przypadku gdyby został zatrzymany przez system z powodu braku pamięci RAM lub w tym przypadku przełączenia jakichkolwiek uprawnień). Nie ma sposobu, aby zapobiec zabiciu aplikacji. – Sazid

0

Miałem podobne problemy z dynamiczną zmianą zezwolenia aplikacji. Po pewnym wykopalisku to, co zrozumiałem, może być również pomocne dla ciebie.

Zmiana uprawnień powoduje przerwanie aplikacji przez system, a teraz, jeśli otworzysz aplikację z ekranu przeglądu, uruchomi ona ponownie twoją aplikację, co jest głównym powodem awarii, ponieważ możesz wykonać operację na obiekcie fragmentu, która jest teraz zerowa.

Należy zwrócić uwagę na to, że przed zakończeniem stan fragmentu jest zapisywany w obiekcie savedinstance.

Aby zatrzymać katastrofę powinien dostać fragment instancji za pomocą tej linii kodu -

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

Here "MAP FRAG" to tag trzeba dać do fragmentu.

udostępnij, jeśli masz jakiekolwiek wątpliwości.