web-dev-qa-db-ja.com

Androidは、アクティビティを離れるときにバックグラウンドスレッドをどのように処理しますか?

Androidアプリは、アクティビティがバックグラウンドに置かれたとき、または強制終了されたときにその状態をディスクに保存する必要があります。onPause()が呼び出されたときにスレッドを開始し、高価なIを実行することをお勧めします。そこにある/ Oプロシージャ( イメージエディタのドキュメント状態をすばやく堅牢に保存/ロードする を参照)。

OSはどのような状況でスレッドを強制終了し、これらの状況はどのくらいの頻度で発生しますか?

OSがスレッドを強制終了することを任意に決定できるアクティビティの処理方法のようになると思いますが、ほとんどの場合、リソースが極端に限られている場合にのみこれを実行します。しかし、これに関するいくつかの特定のドキュメントを見つけるのは素晴らしいことです。

遊んでみると、いくつかのテストコードを使用して、onPause()で開始されたバックグラウンドスレッドがデバイスのバックグラウンドで無期限に実行されます(多くのアプリをロードしようとしましたが、強制終了できませんでした)。

私の特定のアプリでは、コマンドパターンとメメントパターンを使用して編集の取り消しとやり直しを可能にするビットマップエディターを作成しています。ユーザーが編集を元に戻したりやり直したりできるようにしたいと思います。ユーザーに電話がかかってきて、バックグラウンドに置かれるとアクティビティが強制終了されます。私が考えることができる最善の解決策は、バックグラウンドスレッドを使用して、アプリケーションの使用中にコマンドオブジェクトとmementoオブジェクトを常にディスクに保存し、onPauseが呼び出された場合にバックグラウンドスレッドに残っているオブジェクトの保存を完了することです。最悪の場合、スレッドが強制終了された場合、一部の編集が失われるだけです。

32
memcom

OSはどのような状況でスレッドを強制終了し、これらの状況はどのくらいの頻度で発生しますか?

OSは、プロセスを強制終了しない限り、スレッドを強制終了しません-Androidは、自分で作成したスレッドに対して何もしません。フォアグラウンドプロセスの場合、強制終了されません。 Androidフォアグラウンドを失ってから数秒以内にプロセスを強制終了する(onPause()の後)確率はごくわずかです。プロセスの存続期間に関するドキュメント-その内容- -見つけることができます ここ

20
CommonsWare

アクティビティが破棄された後はいつでもスレッドが強制終了される場合があります。または、スレッドが強制終了されることはありません。そのようなスレッドによっては、非常に悪い形式になります。操作が半分完了したり、スレッドが永久に残ったりする可能性があります。

フォアグラウンドアクティビティがない場合でも継続するバックグラウンド操作を実行する場合は、ほとんどの場合、サービス内で実行する必要があります。一方、サービスは可能性は低いですが強制終了されますが、「startForeground」を使用しない限り保証はありません。これにより、バックグラウンドで何かが発生しているという通知がユーザーに表示されますが、私が知る限り、これが、強制終了されないことが保証されている非同期バックグラウンドスレッドを実行する唯一の方法です。

正直なところ、正しい答えは、保存に長い時間がかかる一時的なプロセス状態がないことを確認することです。いくつかのユーザーの変更を反映するために大きなファイルを作成する必要がある場合は、再起動可能な保存操作を作成するために使用できる「トランザクションログ」を維持することを検討してください。これにより、サービスでセーブデータを安全に実行でき、セーブデータが強制終了されても、リソースが利用可能になると自動的に再起動されることがわかります。

4
beekeeper

通常、状態をonPauseに保存するのは、速い場合は正しいことです。プロセスが強制終了されたときに明確に文書化されているとは思いませんが、要求の厳しいアプリを実行すると(たとえば、Google Earthとブラウザを実行した後)、logcatに表示されることがあります。

Android DevToolsには、アクティビティから離れるときにアクティビティを自動的に破棄するオプションもありますが、それはおそらくプロセスには拡張されません(DevToolsはエミュレーター上にあり、一部はルート化されています)。電話)。

あなたのアプローチは合理的に聞こえると思います-優先度の低いスレッドを使用して保存データを常に更新し、onPauseで通常の優先度を与え、onPauseにフラグを設定して終了後に終了するように指示します。

明らかに、onPauseの直後(つまり、スレッドがまだ保存でビジー状態にある間)にonResumeに到達した場合は、同期の問題が発生しないようにする必要があります。

1
EboMike