finish()
内部で呼び出す Android アクティビティがあるonStop()
ため、他のアクティビティ (メイン メニューを含む) に切り替えると、アクティビティがシャットダウンされます。この時点で、すべてが期待どおりに機能します。
ただし、アプリケーションを再度実行すると (場合によっては常にではありません)、アプリケーションが以前と同じ PID を使用して実行され、onCreate()
再度呼び出されることに気付きます。への呼び出しが見られなかったので、呼び出しが の直後に実行されonRestart()
たと仮定します。これは、アクティビティのライフサイクルに違反するものです。アプリが新しい PID を使用する場合、なぜ呼び出されるのか理解できます。これは、これがアクティビティの始まりであるためです。onCreate()
onStop()
onCreate()
なぜこれが起こるのか誰にも分かりますか?
私が開発しているアプリについて少し: これは Unity + Vuforia + Android アプリケーションです。(Unity ではなく) Android でネイティブ UI を作成する必要があるため、カスタム アクティビティを作成します。
Android プロジェクトに報告された同様の問題を見つけました: http://code.google.com/p/android/issues/detail?id=15331しかし、原因が同じかどうかはわかりません。
更新:ログから見ると、呼び出しの後、へのfinish()
呼び出しはありませんonDestroy()
。ただし、私が言及した問題が発生した場合 (同じプロセスを使用してアクティビティが開始された場合)、アクティビティonDestroy()
の開始時に への呼び出しがあります。
update : 更新が遅くなり申し訳ありません。ここでは、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.
問題は、2 回目の実行でonDestroy()
アフターがあることです。onStart()
私のアクティビティは基本的に、Unity のアクティビティのサブクラスでもある Vuforia/QCAR アクティビティのサブクラスです。そのため、 my 内でonDestroy()
、スーパークラスの ( ) を呼び出し、super.onDestroy()
オーバーライドする他のメソッドについても同じことを行います。
Unity と Vuforia/QCAR Android ライブラリ (興味があったので逆コンパイルしました。これは正しくない可能性があります) を見ると、Unity の内部onDestroy()
で、Unity は独自のプロセス (アプリケーション プロセス) を強制終了しようとします。
Process.killProcess(Process.myPid());
したがって、これが発生すると、私のアプリは再びシャットダウンします。2回目の実行が別のプロセスを使用する場合、その奇妙なonDestroy()
ことは起こりません。
noHistory アプローチも試しました。しかし、それでも同じことが起こります :( 2 回目の実行で同じプロセスが使用されると、lateonDestroy()
が表示され、Unity によってプロセスが強制終了されます。