2013-08-21 6 views
8

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.

+1

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? –

+0

@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

+0

@brandall können Sie 'onClick()' und Lebenszyklusmethoden von Fragments teilen? –

Antwort

10

Ich schaute durch den Android-Quellcode für die Nachricht im Stack-Trace und fand heraus, dass es von ActivityManagerService.handleAppDiedLocked() Methode kommt. Beschreibungen dieser Methode sagt "Hauptfunktion zum Entfernen eines vorhandenen Prozesses aus dem Aktivitätenmanager als Ergebnis dieses Prozesses weg. Löscht alle Verbindungen mit dem Prozess." Dies passiert, wenn die Anwendung beendet wird. Es kann durch das System, durch eine andere Anwendung (z. B. eine Task-Manager-App) oder wenn die Anwendung selbst beendet wird (z. B. System.exit(0)), beendet werden.

+0

Interessant - das würde die sehr kleine Menge an Problemen erklären! Ich werde es jetzt lesen und mit meinen Benutzern nachsehen! Vielen Dank. – brandall

+0

Ich habe mit ein paar meiner Nutzer nach diesem Problem gesucht und sie haben keinen Task Killer installiert ... Ich hatte wirklich gehofft, dass du recht hast! – brandall

+0

Sie hatten Recht - nicht aus der Sicht eines Benutzers, aber von meiner Implementierung in der App. Ich habe System.exit (0) aufgerufen; unter bestimmten Umständen, von denen ich dachte, dass sie niemals ausgeführt werden würden - ich lag falsch, passiert, nehme ich an, unter starker Speicherbelastung. Es war diese Antwort, die die beiden verknüpfte - http://stackoverflow.com/a/14756126/1256219 Wenn Sie Ihre Antwort mit einem Verweis auf diesen Beitrag aktualisieren möchten und wie Sie wussten, dass es ActivityManagerService.handleAppDiedLocked() verwandt war, I ' Ich markiere es als richtig. Vielen Dank! – brandall

Verwandte Themen