2012-01-22 13 views
5

Ho un'attività Android che deve chiamare un'altra attività (per ottenere una password dall'utente) prima che venga visualizzato il proprio schermo. Il mio codice al momento lo fa chiamando startActivity() dall'interno di onResume(); è una specie di lavoro, ma ho avuto comportamenti inconsistenti. Qualcuno può dirmi se questo approccio è legale o meno (e se no, come dovrei farlo)?Posso chiamare startActivity() dall'interno di onResume()?

Grazie, Richard.

+0

Definire il comportamento _inconsistent_? –

+0

Le stranezze si verificano quando l'attività viene distrutta e ricreata al cambio di orientamento dello schermo. Passare da verticale a orizzontale produce una diversa sequenza di chiamate ai metodi delle due attività (stop, resume et al) rispetto al contrario, e la sequenza è di nuovo diversa sotto il debugger; Sospetto di una sorta di condizione di gara. Ho anche notato che logcat ha dei reclami di "resume imprevisto ripreso" da system_process. – user1163984

risposta

5

Calling startActivity() in onResume() è assolutamente bene. Ho molte attività che lo fanno, spesso in reazione agli eventi accaduti mentre l'attività veniva interrotta.

Tutto startActivity() fa dire a Android di avviare la nuova attività e aggiungerla all'inizio dello stack posteriore quando diventa disponibile il thread principale, che in questo caso sarà dopo che Android ha terminato di chiamare tutte le callback del ciclo di vita necessarie sul Attività corrente.

Se si verificano comportamenti strani, dubito che sia correlato a questo.

0

È possibile chiamare startActivity() da onResume() ma è una chiamata asincrona. Quindi onResume() (e gli altri metodi dell'attività corrente) continueranno a essere in esecuzione fino a quando il sistema operativo Android non avrà raggiunto la chiamata asincrona startActivity() e avvierà la nuova attività.

Il comportamento dello incoerente è probabilmente correlato all'attività dell'utente che si protrae per un periodo di tempo indefinito finché il sistema operativo non carica la nuova attività.

+0

'startActivity()' è asincrono, ma ciò significa che è non-bloccante, non che sta bloccando, e 'onResume()' continua immediatamente dopo la chiamata, non attende l'altra attività. – Frxstrem

0

In effetti è legale, ma a seconda di ciò che si vuole fare esattamente potrebbe non essere pratico. Un modo comune è iniziare con la tua "seconda" attività come verrebbe definita nel manifest e quindi passare alla prima attività. Ancora un altro modo sarebbe iniziare un'attività per risultato, ad es. onCreate(), che può essere fatto anche prima di chiamare qualsiasi setContentView(). Ci sono molti modi per farlo, quindi credo che abbiamo bisogno di un po 'più di informazioni per essere in grado di fornire una risposta più precisa.

0

Non sembra una buona idea.

Alcune alternative:

  • Per richiedere la password, è possibile utilizzare una finestra di dialogo, invece di un'attività.

  • perché non sempre andare via questa attività intermedia. Nel caso in cui non v'è alcuna necessità di richiedere una password potrebbe mostrare qualcos'altro, come un'animazione mentre si collega al servizio (supponendo che la password è una cosa di rete)

+0

La password decrittografa il contenuto mostrato dall'attività, quindi preferirei avere la password disponibile _before_ I visualizza i dati.Non ho alcuna scelta sull'ordine di attività, perché questo problema si verifica quando l'orientamento dello schermo cambia (cancello deliberatamente la password quando l'attività viene distrutta). – user1163984

+0

Gli utenti accettano di dover immettere nuovamente la propria password ogni volta che accendono il dispositivo? –

+0

Bene, in questo caso, io _am_ l'utente. Ma sì, ho bisogno di trovare un modo per evitare che ciò accada sul cambio di orientamento dello schermo. – user1163984

Problemi correlati