2015-11-03 8 views
12

In Android, se si desidera cancellare lo stack corrente Activity e avviare un nuovo Activity (ad esempio, disconnettendosi dall'app e avviando un log in Activity), sembrano esserci due approcci.Activity.finishAffinity() vs Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK

Ci sono vantaggi a uno rispetto all'altro se il livello API di destinazione è superiore a 16?

1) Fine Affinità

Chiamata finishAffinity() da un'attività. Activity.finishAffinity

2) Flags intento

Intent intent = new Intent(this, LoginActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
startActivity(intent); 
finish(); 

L'approccio finishAffinity() è adatto per> = API 16.

L'approccio Intent flag è adatta per> = API 11.

Per essere chiari, allo scopo di cancellare lo stack Activity corrente, entrambi gli approcci sembrano funzionare allo stesso modo. La mia domanda è: ci sono problemi con le persone che hanno vissuto e, quindi, c'è qualche ragione per scegliere l'una rispetto all'altra?

risposta

10

punto di vista funzionale, non c'è alcuna differenza, ma prove su GenyMotion sembra che vi sia una leggera differenza visiva. Vedi webcast: https://drive.google.com/file/d/0B8Y77sY7Y2CGRS02c3UyNjd2MGs/view?usp=sharing

Dovresti provarlo su una gamma di dispositivi per vedere quanto è coerente.

Soggettivamente, direi andare con lo finishAffinity() perché è più esplicito. Tuttavia, se devi supportare < SDK 16 non hai una scelta.

+0

Il ritardo, o sfarfallio, di cui si parla inizialmente è quello che mi ha fatto porre la domanda finishAffinity(). IIRC, alcuni dispositivi Samsung in particolare avevano uno sfarfallio molto pronunciato quando si utilizza finishAffinity() ma non ho più i dispositivi da testare. –

+0

In questo caso era la versione intent che aveva lo sfarfallio come da video. – brindy

+0

In realtà, non sono sicuro di chiamarlo uno sfarfallio (basato sul video). C'è qualcosa di decisamente diverso in ciò che accade visivamente però. finishAffinity sembra che appaia in cima, la versione intent sembra aver "finito" rivelando l'altro in cima allo stack. – brindy

0

È necessario utilizzare gli indicatori di intento per quello.

E se hai una grande quantità di attività, chiamerai da ognuna per finirle tutte?

È molto meglio e più semplice chiamare semplicemente un intent.

Spero che questo aiuti.

+0

Lo scopo di entrambi gli approcci elencati nella mia domanda è quello di terminare tutte le attività nello stack corrente senza dover chiamare finitura() su ciascuno di essi singolarmente. Per essere chiari, per quanto posso vedere, entrambi gli approcci realizzano questo. –

0

Prova questa

Intent.FLAG_ACTIVITY_CLEAR_TOP 

azzera la pila di attività precedenti

Problemi correlati