2013-05-09 18 views
8

私はアクティビティで新しいスレッドを作成し、スレッドを中断するためにonPause()を使用します。私のアプリケーションがクラッシュしたり、Activityが何らかの形で存在しなくなったりすると、そのスレッドが殺されることになります。アクティビティがもう実行されていないときにonPauseが呼び出されることが保証されていますか?

アクティビティがもはや実行されていないときに、Activity/Fragment.onPause()が呼び出されることは保証されていますか?もしそうでなければ、問題のスレッドが殺されることをどうすれば保証できますか?

答えて

11

私のアプリがクラッシュ

onPause()は(UIまたはそれ以外)ここで呼ばれていませんが、あなたのアプリケーション全体のプロセスが存在しなくなると、これはあなたを気にしてはいけません、あなたが作成したすべてのスレッドを含む場合。

活動は何とか除いて、あなたの活動は、あなたの活動をシャットダウンすることができるあらゆる考えられる方法で行われ、フォアグラウンドからバックグラウンドに移動したときに

onPause()が呼び出されます存在しなくなりますあなたのアプリクラッシュのために。しかし、私が上記のように、アプリケーションのクラッシュは、デフォルトであなたのスレッドを殺すでしょう。

onPause()は、あなたのアクティビティがフォアグラウンドになくなったときに必ず呼び出されます。 onPause()が呼び出された後、あなたのアクティビティはまだ生きていてメモリに残っていますが、onPause()が呼び出されていない状態で、あなたのアクティビティが生きていると考えられるシナリオはありません。

+0

メモリが少なく、システムが現在の実行中の操作のためにメモリを回復する必要がある場合、一時停止されたアクティビティが破棄されます(優先度に応じて)。 – Raghunandan

4

はい、アクティビティが実行されなくなったときにはonPause()が呼び出されます。アクティビティが閉じているとすると、一連のイベントはonPause() - >onStop() - >onDestroy()になります。別のアクティビティが開始されたとき、または画面がオフになったときにアクティビティがバックグラウンドに入っても、他の2つのメソッドが呼び出されなくても常にonPause()が呼び出されます。したがって、アクティビティが終了してもonPause()が呼び出され、スレッドが強制終了されます。

あなたのアプリがクラッシュしたときに、あなたのアクティビティ全体とともに、あなたが起動したスレッドでさえ、Androidによって処理されます。

1

アクティビティAとBの2つのアクティビティがあるとします。アクティビティAはバックグラウンドに移動します。アクティビティAは一時停止しています。アクティビティBは、フォ​​ーカス、すなわちフォアグラウンドをとる。あなたが戻るボタンをクリックすると、アクティビティAはバックスタックからポップされ、アクティビティAはフォーカスをとります。つまり、アクティビティAが再開します。

アクティビティでダイアログを表示すると、[戻る]ボタンのクリック時に一時停止中のアクティビティとダイアログが表示され、アクティビティが再開されます(フォアグラウンド)。

アクティビティがもう実行されていないときは、バックグラウンドで一時停止しています。私はRaghav Soodに、アプリクラッシュ時に何が起こるかに同意します。

あなたが通常にonPause()コールバックを使用する必要があります。

ストップアニメーションやCPUを消費する可能性が他の進行中のアクション。 保存されていない変更をコミットします。ただし、ユーザーが退去時に永久に保存されるような変更(メールの下書きなど)が必要な場合に限ります。 ブロードキャストレシーバなどのシステムリソース、センサ(GPSなど)へのハンドル、またはアクティビティが一時停止している間にバッテリ寿命に影響を与える可能性のあるリソースを解放します。

注:

複数のタスクを同時にバックグラウンドで保持することができます。ただし、ユーザーが複数のバックグラウンドタスクを同時に実行している場合、システムはバックグラウンドアクティビティを破棄してメモリを回復し、アクティビティ状態を失わせる可能性があります。

関連する問題