2010-11-15 1 views

Antwort

57

Wenn Sie startActivity() ausführen, wird nur Ihre Absicht in einer Warteschlange von Ereignissen veröffentlicht. Der eigentliche Start der Aktivität geschieht in naher Zukunft asynchron. Ich sehe also keinen großen Unterschied zwischen den beiden.

+1

klingt es auch für mich vernünftig – Tima

+3

Die Animation ist anders für mich. Siehe meine Antwort unten. – Monstieur

+0

aber Ansatz ist nur völlig falsch. Es gibt Flags (für Absicht sowie Manifest), die tatsächlich für diese Anwendungsfälle existieren. – Ewoks

6

Ich würde die zweite Wahl treffen, ich unterstütze dies nicht auf irgendetwas, das ich von offiziellen Quellen nachgeschlagen habe, aber es macht mehr Sinn, die neue Aktivität zu starten, bevor Sie fertigstellen, auf diese Weise erscheint die neue Aktivität über eine Absicht, und die jetzt Hintergrundaktivität kann alle ihre Bereinigungsmethoden aufrufen.

Wenn Sie es andersherum machen würden, hätte vielleicht die Absicht keine Zeit zu feuern, bevor die Reinigung durchgeführt wird. I.e. Ruft die Aktivität startActivity() nach dem Aufruf von finish() auf?

Ich hoffe, Sie verstehen, was ich versuche zu sagen, würde ich die zweite Option nur um sicher zu sein.

+0

Ja, ich habe Ihre Idee verstanden. Es klingt logisch. Aber ich kann mir nicht vorstellen, wenn diese Situation möglich sein könnte – Tima

6

Neben der Emmanuels Antwort:

Beiden Methoden startActivity und finish werden nach das Ende der rufenden Methode eingeplant werden, da beide von dem UI-Thread verarbeitet werden.

1

hatte ich ähnliches Problem:

Activity A: singleInstance 
Activity B: singleInstance 
Activity C: singleInstance 

A starts B 
B starts C 
C wants to start A: 

hier, wenn ich benutze:

finish(); 
startActivity(A); 

etwas verdrahtet passiert: Aktivität B kommt anstelle von A in den Vordergrund! aber wenn ich den Code wie folgt zu ändern:

startActivity(A); 
finish(); 

scheint alles in Ordnung und Aktivität A kommt sichtbar.

Ich weiß nicht, was das Problem ist, aber es scheint, dass die B ist im ersten Fall wird C vor der Ausführung des Befehls startActivity abgeschlossen, so dass der zurück Stapel die Situation behandelt und zeigt seine Top-Aktivität! aber im zweiten Fall passiert alles normal.

+0

Wenn Sie die Anwendung beenden(), Android zieht die LRU-Aktivität aus dem Stapel, die B ist. Auch, die mich denken, dass finish() ist sofort und nicht asynchron. –

18

Die Animation ist deutlich anders (mindestens ab 4.1). Der Aufruf von finish() beginnt zuerst, die erste Aktivität früher zu verblassen und Sie können kurz einen schwarzen Hintergrund sehen, bevor die neue Aktivität eingeblendet wird. Das Aufrufen von startActivity() blendet zuerst die neue Aktivität über die alte ein und der schwarze Hintergrund ist nicht sichtbar.

0

Normalerweise mache ich startActivity() vor finish() als ich denke, dass würde sicherstellen, dass der neue Bildschirm herauskommt, bevor der vorherige erlischt.

Ich habe eine Login-Seite in meiner App. Nach einer erfolgreichen Benutzeranmeldung ist die Anmeldeaktivität beendet und die Hauptaktivität ist aktiv.Es funktioniert gut in der Android 4.

Heute wollte ich es in Material Design umschreiben. Ich habe jedoch ein großes Problem. Neues Android-Studio erstellt leere Aktivitäten mit Materialdesign, von denen ich denke, dass sie viele Ressourcen benötigen. Der gleiche Prozess, aber ich habe den Fehler

11-26 18:20:44.450 18397-18397/? I/Choreographer: Skipped 42 frames! The application may be doing too much work on its main thread. 
11-26 18:20:44.485 18397-18408/? I/art: Background partial concurrent mark sweep GC freed 2864(191KB) AllocSpace objects, 4(43MB) LOS objects, 13% free, 100MB/116MB, paused 8.056ms total 39.767ms 

Es wird gesagt, meine apps viele Ressourcen nimmt, wenn mainActivity beginnt in meinem Handy logcat. Ich habe nichts in mainActivity nur, dass es das Standard-Material-Design-Layout ist.

Ich habe die Reihenfolge umgekehrt und jetzt funktioniert es ohne Fehler auf meinem Handy.

Verwandte Themen