2015-07-14 19 views
5

Quando installo la mia app su determinati dispositivi (sembra essere 4.4.4 e successive) A volte vedo il seguente ANR in com.android.launcher dopo i seguenti passi:ANR in com.android.launcher dopo aver toccato indietro

  1. dall'attività a, lancio attività B
  2. in Attività B, premere il sistema di back chiave e nel metodo onBackPressed() di attività B rilancio Activity a (codice è al di sotto).
  3. Il tasto di ritorno del sistema rimane premuto per 5 secondi, lo schermo diventa nero, la mia app si chiude e viene avviato Launcher. Lo studio dei registri mostra un ANR nel processo di avvio.

ANR a com.android.launcher (com.android.launcher/com.android.launcher2.Launcher) Motivo: ingresso dispacciamento timeout (attesa perché nessuna finestra è attiva ma non v'è un applicazione mirata che possono eventualmente aggiungere una finestra quando finiture messa in funzione.)

si noti che l'ANR si sta verificando in com.android.launcher (non nel mio app).

Btw, NON sto facendo un'operazione costosa nei miei metodi onBackPressed/onPause/onStop.

I registri mostrano anche che onBackPressed() non viene richiamato quando si verifica l'ANR - un comportamento molto strano, come si può vedere qui:

## User starts Activity A from Android Launcher 
D/Activity A: onResume() 
D/Activity A: onClick(): start Activity B 
D/Activity A: onPause() 
D/Activity B: onResume() 

## User taps system back key (and onBackPressed() launches Activity A) 
D/Activity B: onBackPressed(): start Activity A 
D/Activity B: onPause() 
D/Activity A: onResume() 
D/Activity A: onClick(): start Activity B 
D/Activity A: onPause() 
D/Activity B: onResume() 

## User taps system back key (but onBackPressed() is not invoked. Instead an ANR occurs) 
I/InputDispatcher( 557): ANR in com.android.launcher 
D/Activity B: onPause() 

Ecco il mio metodo onBackPressed():

public void onBackPressed() { 
    Intent intentStartRoot = new Intent().setComponent(new ComponentName(this, ActivityHome.class)); 
    intentStartRoot.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
    startActivity(intentStartRoot); 
} 
+0

pubblicare il tuo codice di onbackpress – Elltz

+0

ho aggiunto il codice onBackPressed(). Buon suggerimento –

risposta

6

Questo è probabilmente un bug in Android Framework. Ho testato su circa 12 dispositivi di oggi e ho notato che questo bug si verifica in modo affidabile su dispositivi Nexus-tipo che eseguono queste versioni di Android:

  • 4.4.4
  • 5.0.1
  • 5.0.2

È interessante notare che i dispositivi Samsung con le stesse versioni di Android non presentano il problema. Android 5.1 e versioni successive sembra essere migliore in quanto non vedo più ANR in com.android.launcher; tuttavia ora sto visualizzando gli ANR in com.google.android.googlequicksearchbox.

Ho risolto questo problema dopo aver notato che la mia attività stava sovrascrivendo suBackPressed() senza richiamare super.onBackPressed(). Dopo aver aggiunto super.onBackPressed(), gli ANR sono andati via. Ma questa non è una soluzione completa perché chiamare super.onBackPressed() ha terminato la mia attività, che non desidero.

Spero che questo aiuti qualcuno.

See: Using FLAG_ACTIVITY_REORDER_TO_FRONT to switch among persistently running UI activities leads to "no window focus" error

See: Android-L issue: onBackpressed when using FLAG_ACTIVITY_REORDER_TO_FRONT to launch previous activity & freezes app for sometime

Inoltre, ho trovato una voce di bug sul sito di Google che sembra correlato: https://code.google.com/p/android/issues/detail?id=91534

+1

non è vero, se si esegue l'override su onbackpressed e non si fa nulla, non verrà eseguito nulla e quindi no anr, – Elltz

+0

Ciò sarebbe normalmente vero ma non nel mio caso perché il mio metodo onBackPressed() stava avviando l'attività A. Ho modificato la mia domanda originale per includere queste informazioni. Grazie per il tuo suggerimento che includo il codice sorgente. –

+1

esperienza simile. Ho 2 attività che posso passare avanti e indietro utilizzando FLAG_ACTIVITY_REORDER_TO_FRONT. La cosa più strana è: il bug si verifica solo se passo da A-> B-> A .. Non succede su A-> B, o A-> B-> A-> B, o anche A-> B-> A-> B-> A, o qualsiasi altra combinazione .. Potrei anche mettere questo problema nella parte Problemi noti del readme del mio software. E vero, per lo più accade su nexusian 4.x a 5.x (emulatori) .. ho provato l'emulatore 6.x ed è ok. provato sul mio telefono non nexus, e funziona anche bene. – antony

Problemi correlati