9

Der Fragetitel klingt vielleicht kompliziert, aber hier ist meine Situation.onCreate() wird beim erneuten Öffnen der letzten Aufgabe aufgerufen, nachdem die Berechtigungseinstellungen geändert wurden

Ich habe ein Kartenfragment innerhalb einer Aktivität. Einfach. Storage-Berechtigung aktivieren, um die Anzeige von Map zu ermöglichen, funktioniert einwandfrei. Hintergründe der App durch Drücken der Home-Taste, dann deaktivieren Sie die Speicherberechtigung und öffnen Sie die App von der letzten Aufgabe, app stürzt ab.

Das Problem ist, anstatt onResume() der Host-Aktivität aufzurufen, onCreate() wird sowohl auf der Host-Aktivität als auch onCreateView() des Map-Fragments aufgerufen. Daher wirft es Ausnahmen.

Es scheint, als ob der App-Prozess beendet wird, wenn die Berechtigung geändert wird und somit die Aktivität neu erstellt wird.

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) 

Von super.onStart() aus der Aktivität

+1

Die Lebenszyklusmethoden wurden nicht geändert. Was passiert, ist, dass die Aktivität vom System zerstört wurde. Aus diesem Grund wird Ihre Aktivität neu erstellt und warum onCreate aufgerufen wird. – eddiecubed

+0

Sagst du, dass die Aktivität aufgrund von Änderungen der Berechtigung zerstört wurde? Da onResume() normal aufgerufen wird, wird stattdessen onCreate() aufgerufen, wenn die Berechtigung für diese Aktivität geändert wird, in meinem Fall das Kartenfragment in der Aktivität. – WenChao

+1

Wenn es eine Erlaubnis Änderung gibt, wird die Aktivität immer zerstört – greywolf82

Antwort

0

Die praktikable Lösung ist jetzt nur getSupportFragmentManager().popBackStackImmediate(); in onCreate (zu nennen) die Aktivität, um zu verhindern versuchen, das Fragment der Karte neu zu erstellen.

popBackStack() wird in diesem Fall nicht funktionieren, da es asynchron ist.

0

Wahrscheinlich ein bisschen spät, vielleicht noch andere in der Zukunft helfen :)

sollten Sie überprüfen, um zu sehen, ob savedInstanceStatenull ist, die an onCreate(Bundle savedInstanceState) geben wird. Wenn es null ist nur dann starten Sie das Fragment wie so:

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

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

ok, aber nachdem onCreate() aufgerufen wurde, wird ondestroy() auch so aufgerufen, dass die App geschlossen wird. Verhindert SavedInstanceState zu meiner App vom Ende? – MiloRambaldi

+0

@MiloRambaldi 'savedInstanceState' enthält nur Informationen über den letzten Status der App (falls sie vom System wegen mangelndem RAM oder in diesem Fall das Umschalten aller Arten von Berechtigungen gestoppt wurde). Es hat keine Möglichkeit zu verhindern, dass die App getötet wird. – Sazid

0

ich mit der dynamischen Veränderung der App die Erlaubnis ähnliche Probleme hatte. Nach einigem Grasen könnte das, was ich verstanden habe, auch für dich hilfreich sein.

Die Änderung der Berechtigung führt zu einer Beendigung der Anwendung durch das System. Wenn Sie Ihre Anwendung jetzt über den Übersichtsbildschirm öffnen, wird die Anwendung neu gestartet. Dies ist der Hauptgrund für Ihren Absturz, da Sie möglicherweise eine Operation für ein Fragmentobjekt ausführen. Das ist jetzt null.

Ein wichtiger Punkt hier zu beachten ist, dass vor der Beendigung der Fragment-Status in gespeichert wird, instance Objekt gespeichert wird.

Absturz stoppen Sie Fragment-Instanz mit dieser Codezeile erhalten sollen -

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

Hier „MAP FRAG“ ist ein Tag, das Sie zu Ihrem Fragmente geben.

teilen, wenn Sie irgendwelche Verwirrung haben.