11

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 によってプロセスが強制終了されます。

4

4 に答える 4

12

新しいアクティビティを新しいプロセスで実行する必要があると想定することは、理解できるが重大な誤りを犯しています。Android では実際にはそうではありません。新しいアクティビティ インスタンスの onCreate() を、以前のアクティビティ インスタンスをホストした後に保持されていたプロセスで発生させることができます。

これにより、プロセスに関して静的なものはすべて(特に、ネイティブコードだけではありませんが)不可解なほど信頼できなくなります。

開始されるアクティビティは新しいアクティビティであるため、onRestart() を受け取りません。これは、既存のアクティビティを再開する場合にのみ発生します。

于 2012-06-21T15:18:42.460 に答える
5

noHistory="true"アクティビティのマニフェストエントリを設定してみませんか?そうすれば、onStop()でアクティビティを手動で終了することを心配する必要はありません。

http://developer.android.com/guide/topics/manifest/activity-element.htmlでnoHistoryを検索します

または、代わりに、インテントを 設定FLAG_ACTIVITY_NO_HISTORYします。http://developer.android.com/reference/android/content/Intent.html#FLAG%5FACTIVITY%5FNO%5FHISTORYstartActivity()

于 2012-06-21T19:15:14.377 に答える
3

リンクのドキュメントでは、の説明onDestroyは次のとおりです。

アクティビティが破棄される前に受け取る最後の電話。これは、アクティビティが終了 している ( finish()が呼び出された)ため、またはシステムがスペースを節約するためにアクティビティのこのインスタンスを一時的に破棄しているために発生する可能性があります。これら 2 つのシナリオは、isFinishing() メソッドで区別できます。

foronStopは次のとおりです。

別のアクティビティが再開され、このアクティビティをカバーしているため、アクティビティがユーザーに表示されなくなったときに呼び出されます。これは、新しいアクティビティが開始されているか、既存のアクティビティがこのアクティビティの前に移動されているか、またはこのアクティビティが破棄されているために発生する可能性があります。このアクティビティがユーザーと対話するために戻ってくる場合は onRestart() が続き、このアクティビティがなくなる場合は onDestroy() が続きます。

これはfinish()呼び出しonDestroyが onStop ではないことを意味するため、内部への呼び出しが強制的に実行されるため、アクティビティが再開されたときにonCreate呼び出す必要があります。finish()onStoponDestroy

于 2012-06-21T15:13:07.310 に答える