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.
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? –
@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
@brandall puoi condividere i metodi 'onClick()' e il ciclo di vita di Fragment? –