0

4 つのアクティビティを持つ単純なアプリを作成しています。私が達成しようとしていることを理解できるように、簡単に説明します。

最初のアクティビティ - MainActivity には、2 つの入力パラメータを収集するいくつかの TextEdit フィールドがあります - 担当者数と一時停止の長さ (秒単位)。ボタンをクリックすると、2 番目のアクティビティである WorkActivity に移動します。「完了」を押すまでカウントを開始し、PauseActivity を呼び出すか、最後の担当者の場合は OverviewActivity を呼び出します。PauseActivity は、次のレップまでの秒数をカウントダウンし、ビープ音を鳴らして時間であることを知らせ、再び WorkActivity を表示します。OverviewActivity は、ワークアウトの合計時間と各担当者の時間を示します。

また、アプリを終了するだけのボタンも備えています。アプリを終了することは、Android アプリケーションのライフ サイクルの哲学に実際には沿っていないことはわかっていますが、それが必要です (または、そのようなことが起こる必要があります)。担当者を追跡し、時間を記録するシングルトン コントローラー クラスがあります。このインスタンスを強制終了できます (または、その死を偽装して新しいインスタンスが作成されます) が、アプリを「閉じて」もう一度クリックすると、期待される MainActivity ではなく、OverviewActivity が取得されます。

System.exit(0) を呼び出すと処理が行われ、アプリケーションがシャットダウンされるだけなので、再度実行するときに新たに初期化する必要があると予想していました。代わりに、全体が本当におかしくなり始めました。System.exit(0) を呼び出すボタンをクリックすると、アプリの再起動が消える代わりに。WorkActivity を表示し、カウントを開始します。完了ボタン (PauseActivity に移動する必要があります) をクリックすると、例外が発生します。アプリケーションがクラッシュし、再び再起動します。これは、ホーム画面のボタンを押すまで繰り返され、アプリケーション マネージャーで強制終了するまで、アプリはこの役に立たない状態のままになります。

また、正確にはわかりませんが、 System.exit(0) 呼び出し (またはその後のクラッシュ) がデバッガーを切断すると思います。これは、後で Eclipse にブレークポイントをヒットさせることができなかったためです。これは、発生する実際の例外を実際に見ることができないことを意味します。

誰かがこれに光を当てることができますか? System.exit(0) を正しく使用する方法はありますか?

このオプションがない場合、これを処理する正しい方法は何でしょうか? 私はアプリが必要です: - 最後の「完了」ボタンのホームボタンまたは戻るボタンをクリックすると、コントローラー (および可能であれば他のすべて) を破棄し、カウントを停止し (タイマーが実行されている場合)、本質的にそれ自体をシャットダウンします。 down) - アプリのアイコンをもう一度クリックすると、MainActivity を含む新しいインスタンス (または新しく表示されるインスタンス) が表示され、既定の状態で他のすべてのアクティビティが表示されます。

4

1 に答える 1

5

System.exit(0) を使用するのは悪い習慣です。

この場合、 exit() を呼び出すとプロセスが終了し、他のコンポーネントが強制終了され、データが破損する可能性があります。もちろん、OS はあまり気にしないかもしれませんが、ユーザーはそれを評価しないかもしれません。

内部の Dalvik ヒープ制限を使い果たした場合、プロセスを自発的に強制終了しても、他のアプリケーションには役立ちません。デバイスの物理メモリの量に関係なく、OS には、Dalvik がヒープ割り当てのプロセスで使用できるメモリの量に制限があります。したがって、システムのメモリの半分が空いていて、特定のアプリケーションがまだ OOM にヒットしている可能性があります。

System.exit(0) を使用しないでください。代わりに、finish() を使用できます。

Intent intent = new Intent(this, Activity2.class);
startActivity(intent);
finish();
于 2013-07-27T16:09:00.563 に答える