2013-08-21 12 views
8

Sono di fronte a un problema molto confuso per un numero molto piccolo di utenti. L'errore si verifica quando un pulsante viene premuto all'interno di un frammento, che avvia un'altra attività frammento. Ecco l'analisi dello stack:Attività frammento: l'app è morta, nessuno stato salvato

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 

A causa di questa linea di l'errore:

com.brandall.nutter/.ActivityLinkAppsFragment}: app died, no saved state 

Ho letto molti post su Frammento salvato gli stati, ma nessuno sembra applicarsi nella mia situazione, piuttosto agli stessi Frammenti, che non sono menzionati nella traccia dello stack. Gli altri posti suggeriscono di aggiungere a ogni frammento:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
} 

Io attualmente non hanno la precedenza il metodo onCreate in nessuna delle mie Frammenti.

Ho visto anche suggerito di aggiungere questo per ogni frammento:

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    setUserVisibleHint(true); 
} 

A parte il fatto che sta accadendo solo a un piccolo numero di utenti, la questione più sconcertante è con il contesto utilizzato:

final Intent sa = new Intent(getActivity(), ActivityLinkAppsFragment.class); 
getActivity().startActivity(sa); 

la mia applicazione ha un servizio di primo piano e se io invece uso il contesto statico di che (attraverso una getServiceContext statico() metodo) nell'intento di cui sopra, il problema non si verifica più per gli utenti e il frammento di attività si apre correttamente .

Non capisco perché l'uso di un altro contesto dovrebbe impedire il verificarsi del problema, ma spero che con le informazioni che ho fornito, abbia senso per qualcuno!

Posso fornire il codice FragmentPagerAdapter che sto utilizzando se risulta essere rilevante, ma è piuttosto standard.

vi ringrazio in anticipo

EDIT - Qualcosa di molto importante che ho dimenticato di aggiungere. Ciò non causa l'arresto anomalo dell'app a. Invece l'attività da cui è frammentato, viene riavviata immediatamente.

RISPOSTA - Ciò è stato causato a causa di chiamarmi System.exit(0) in circostanze ho pensato possibile solo quando l'utente ha voluto 'a filo' l'utilizzo della memoria dell'applicazione. Ho sbagliato e potrebbe anche essere chiamato quando il dispositivo dell'utente stava gestendo condizioni di memoria insufficiente. @ La risposta di beworker è contrassegnata come corretta, come ha notato ActivityManagerService.handleAppDiedLocked() che era il risultato di questo.

+1

Questo si verifica ancora se si utilizza il modello consigliato di registrazione di un listener in 'Activity' e la gestione di' startActivity' lì?'Fragments' non dovrebbe mai iniziare lì proprio' Attività' perché non c'è modo per loro di sapere se un'attività dovrebbe essere avviata, o un Frammento dovrebbe essere aggiunto/sostituito. Inoltre, perché stai utilizzando "Intent.FLAG_ACTIVITY_NEW_TASK" qui? –

+0

@PaulBurke La bandiera non dovrebbe essere lì - Mi spiace di essere fuorviante, è rimasta dal mio test, la rimuoverò dalla domanda. Dato che gestisco le mie attività come uno stack molto semplice, non ho mai dovuto considerare se "dovrebbero essere avviate" o meno. Cercherò l'approccio dell'ascoltatore che descrivi. Grazie. – brandall

+0

@brandall puoi condividere i metodi 'onClick()' e il ciclo di vita di Fragment? –

risposta

10

Ho controllato il codice sorgente di Android per il messaggio nello stack trace e ho scoperto che proviene dal metodo ActivityManagerService.handleAppDiedLocked(). Descrizioni di questo metodo dice "Funzione principale per la rimozione di un processo esistente dal gestore attività come risultato del processo in corso. Cancella tutte le connessioni al processo." Questo succede quando l'applicazione viene uccisa. Può essere ucciso dal sistema, da un'altra applicazione (ad esempio un'app manager) o quando l'applicazione viene completata da sola (ad esempio System.exit(0)).

+0

Interessante - questo spiegherebbe la quantità molto piccola di problemi! Leggerò su adesso e controllo con i miei utenti! Grazie. – brandall

+0

Ho controllato con alcuni dei miei utenti questo problema e non hanno installato un task killer ... Speravo davvero che avessi ragione! – brandall

+0

Avevi ragione: non dal punto di vista dell'utente, ma dalla mia implementazione nell'app. Stavo chiamando System.exit (0); in determinate circostanze che pensavo non sarebbe mai stato eseguito - mi sono sbagliato, capita, suppongo, sotto carico di memoria pesante. Era questa la risposta che collegava i due: http://stackoverflow.com/a/14756126/1256219 Se vuoi aggiornare la tua risposta con un riferimento a quel post e come sapevi che era ActivityManagerService.handleAppDiedLocked() correlato, I ' Lo contrassegnerò come corretto. Grazie! – brandall

Problemi correlati