Ich habe eine Android-Aktivität, die finish()
innerhalb es onStop()
aufruft, also wenn ich zu anderen Aktivitäten (einschließlich des Hauptmenüs) wechseln, wird die Aktivität heruntergefahren. Bis zu diesem Punkt funktioniert alles wie erwartet.onCreate() nach Ende() in onStop()
Allerdings, wenn ich die Anwendung erneut ausführen (manchmal nicht immer), merke ich, dass die Anwendung mit der gleichen PID wie die vorherige ausgeführt wird und es ruft wieder onCreate()
. Ich habe keinen Anruf an onRestart()
gesehen, also nehme ich an, dass onCreate()
Aufruf direkt nach onStop()
ausgeführt wird, was etwas gegen die activity lifecyce ist. Wenn die App eine neue PID verwendet, kann ich verstehen, warum onCreate()
aufgerufen wird, da dies der Beginn der Aktivität ist.
Wer weiß, warum das passiert?
Ein bisschen über die App, die ich entwickle: Dies ist eine Unity + Vuforia + Android-Anwendung. Ich erstelle eine benutzerdefinierte Aktivität, weil ich eine native Benutzeroberfläche für Android erstellen muss (anstelle von Unity).
Ich fand ein ähnliches Problem in das Android-Projekt gemeldet: http://code.google.com/p/android/issues/detail?id=15331, aber ich bin mir nicht sicher, ob die Ursache die gleiche ist oder nicht.
Update: Von dem, was ich aus dem Protokoll zu sehen, die nach dem finish()
Anruf, dort onDestroy()
kein Anruf. Wenn das von mir erwähnte Problem jedoch auftritt (die Aktivität wird mit demselben Prozess gestartet), wird zu Beginn der Aktivität ein Aufruf an onDestroy()
gesendet.
Update: Entschuldigung für das späte Update. Hier zeige ich einen Ausschnitt des Logcat.
## First run
I/ActivityManager( 265): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=the.app/the.app.UnityAriusActivity bnds=[238,115][351,273] } from pid 423
I/ActivityManager( 265): Start proc the.app for activity the.app/the.app.UnityAriusActivity: pid=1686 uid=10013 gids={3003, 1006, 1015}
D/arius (1686): UnityAriusActivity: onStart
D/arius (1686): UnityAriusActivity: onResume
## Home button is pressed
I/ActivityManager( 265): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.sonyericsson.home/.HomeActivity } from pid 265
D/arius (1686): UnityAriusActivity: onPause
D/arius (1686): UnityAriusActivity: onStop
## Second run
I/ActivityManager( 265): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=the.app/the.app.UnityAriusActivity bnds=[238,115][351,273] } from pid 423
## Same process, onStart is called again
D/arius (1686): UnityAriusActivity: onStart
D/arius (1686): UnityAriusActivity: onResume
I/ActivityManager( 265): Displayed the.app/the.app.UnityAriusActivity: +500ms
D/Unity (1686): Creating OpenGL ES 2.0 context (RGB16 565 16/0)
W/IInputConnectionWrapper( 423): showStatusIcon on inactive InputConnection
I/QCAR (1686): onSurfaceCreated
## Strangely, there's an onDestroy here
D/arius (1686): UnityAriusActivity: onDestroy
## Unity apparently kills the process from its onDestroy
I/Process (1686): Sending signal. PID: 1686 SIG: 9
I/ActivityManager( 265): Process the.app (pid 1686) has died.
Das Problem ist, dass es eine onDestroy()
nach onStart()
auf dem zweiten Lauf ist. Meine Aktivität ist im Grunde eine Unterklasse der Vuforia/QCAR-Aktivität, die auch eine Unterklasse der Aktivität von Unity ist. Also, in meinem onDestroy()
, mache ich einen Aufruf an die Oberklasse '(super.onDestroy()
) und auch das gleiche für die anderen Methoden, die ich überschreibe.
Wenn ich die Unity und Vuforia/QCAR Android Bibliothek angeschaut habe (ich war neugierig, also habe ich sie dekompiliert - ja, das könnte nicht stimmen), in Unity onDestroy()
versucht Unity seinen eigenen Prozess zu töten (was die Anwendung ist verarbeiten).
Process.killProcess(Process.myPid());
Also, wenn das passiert, meine App gerade wieder heruntergefahren. Wenn der zweite Lauf einen anderen Prozess verwendet, passiert dieser seltsame onDestroy()
nicht.
Ich habe auch den noHistory Ansatz versucht. . Aber das Gleiche noch passiert :(Wenn der zweite Lauf das gleiche Verfahren verwendet, ein spätes onDestroy()
erscheinen und dann wird der Prozess durch Unity töten
Ich muss auch 'finish()' aufrufen, wenn der Benutzer die Home-Taste drückt. Deshalb rufe ich es von 'onStop()'. – fajran
Jeder Aufruf von finish() erzwingt onCreate erneut auszuführen, da dies die Aktivität –
zerstört. Was genau ist das Problem hier? Das onDestroy() wird nicht aufgerufen? Oder dass es aufgerufen wird?Der Aktivitätslebenszyklus scheint es erforderlich zu machen, dass Sie mit beiden Möglichkeiten umgehen. –