Ich bin mit einem sehr verwirrenden Problem für eine sehr kleine Anzahl meiner Benutzer konfrontiert. Der Fehler tritt auf, wenn innerhalb eines Fragments eine Schaltfläche gedrückt wird, die eine andere Fragmentaktivität startet. Hier ist der Stack-Trace:Fragment Activity - App gestorben, kein Status gespeichert
I/20:22:23.901 ActivityManager(1668)
Start proc com.brandall.nutter for activity com.brandall.nutter/.ActivityHomeFragment: pid=8956 uid=10125 gids={50125, 3003, 3001, 3002, 1015, 1023, 1006, 1028}
I/20:22:23.881 WindowState(1668)
WIN DEATH: Window{41ed1948 u0 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment}
W/20:22:23.881 ActivityManager(1668)
Force removing ActivityRecord{411c4188 u0 com.brandall.nutter/.ActivityLinkAppsFragment}: app died, no saved state
I/20:22:23.881 WindowState(1668)
WIN DEATH: Window{41b6a178 u0 Toast EXITING}
W/20:22:23.881 InputDispatcher(1668)
Attempted to unregister already unregistered input channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)'
W/20:22:23.871 ActivityManager(1668)
Scheduling restart of crashed service com.brandall.nutter/.TTSS in 80000ms
I/20:22:23.871 ActivityManager(1668)
Process com.brandall.nutter (pid 8907) has died.
I/20:22:23.871 WindowState(1668)
WIN DEATH: Window{411d4ff0 u0 com.brandall.nutter/com.brandall.nutter.ActivityHomeFragment}
E/20:22:23.871 InputDispatcher(1668)
channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)' ~ Channel is unrecoverably broken and will be disposed!
W/20:22:23.871 InputDispatcher(1668)
channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)' ~ Consumer closed input channel or an error occurred. events=0x9
Aufgrund dieser Linie des Fehlers:
com.brandall.nutter/.ActivityLinkAppsFragment}: app died, no saved state
Ich habe viele Beiträge über Fragment gespeicherten Zustände zu lesen, aber keine scheinen in meine Verhältnisse anzuwenden, eher zu den Fragmenten selbst, die in der Stack-Spur nicht erwähnt werden. Die anderen Beiträge zu jedem Fragment schlagen hinzu:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
ich derzeit die onCreate Methode in keinem meiner Fragmente nicht außer Kraft setzen.
Ich habe auch zu jedem Fragmente vorgeschlagen Zugabe gesehen:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
setUserVisibleHint(true);
}
Abgesehen von der Tatsache, dass es nur auf eine sehr kleine Anzahl von Benutzern geschieht, die verblüffende Frage ist mit dem verwendeten Kontext:
final Intent sa = new Intent(getActivity(), ActivityLinkAppsFragment.class);
getActivity().startActivity(sa);
Meine Anwendung hat einen Vordergrund-Service und wenn ich statt den statischen Kontext, dass verwenden (durch einen statischen getServiceContext() -Methode) in dem Intent oben, das Problem tritt nicht mehr für die Benutzer und das Fragments Aktivität öffnet korrekt .
Ich verstehe nicht, warum die Verwendung von einem anderen Kontext das Problem von verhindern soll, aber ich hoffe mit den Informationen, die ich geliefert habe, wird es Sinn für jemanden ergeben!
Ich kann den FragmentPagerAdapter-Code liefern, den ich verwende, wenn es sich als relevant erweist, aber es ist ziemlich Standard.
Ich danke Ihnen im Voraus
EDIT - Etwas sehr wichtig ich hinzufügen vergessen. Dies führt nicht zum Absturz der App. Stattdessen wird die Aktivität, in der sich das Fragment befindet, sofort neu gestartet.
ANTWORT - Dies wurde verursacht, weil ich System.exit(0)
unter Umständen anrief, dachte ich nur möglich, wenn der Benutzer die Speichernutzung der App 'leeren' wollte. Ich habe mich geirrt und es könnte auch angerufen werden, wenn das Gerät des Benutzers mit wenig Speicher arbeitet. @ beworker's Antwort unten ist als korrekt markiert, wie er notierte ActivityManagerService.handleAppDiedLocked()
, was ein Ergebnis davon war.
Tritt dies immer noch auf, wenn Sie das empfohlene Muster verwenden, um einen Listener in der 'Activity' zu registrieren und' startActivity' dort zu behandeln?'Fragmente' sollten niemals eigene' Aktivitäten' starten, da sie nicht wissen können, ob eine Aktivität gestartet werden soll oder ob ein Fragment hinzugefügt/ersetzt werden soll. Warum verwenden Sie auch 'Intent.FLAG_ACTIVITY_NEW_TASK' hier? –
@PaulBurke Die Flagge sollte nicht da sein - Es tut mir leid, dass sie in die Irre geführt wird, sie ist von meinen Tests übrig geblieben, ich werde sie von der Frage entfernen. Da ich meine Aktivitäten als einen sehr einfachen Stack behandle, musste ich nie darüber nachdenken, ob sie "gestartet" werden sollten oder nicht. Ich suche nach dem Ansatz, den Sie beschreiben. Vielen Dank. – brandall
@brandall können Sie 'onClick()' und Lebenszyklusmethoden von Fragments teilen? –