より具体的に: タスクのキャンセルを onDestroy に配置しても安全ですか? また、受信者の登録を解除してリソースを解放するために onDestroy を使用しても安全ですか?
私の目的は、アクティビティが破棄される前ではなく、タスクがキャンセル/破棄されるようにすることです。
onDestroy():
- アクティビティが破棄され、リソースを解放する必要があるときに呼び出されます。
- アクティビティが急いで破棄された場合 (システムのリソースが不足している場合など) は呼び出されません。
最初のケースは明らかです。onDestroy ですべてのクリーニングを行い、問題は発生しません。ただし、2番目のケースは少し問題です。アクティビティが破棄され、onDestroy がスキップされると (タスクをキャンセルしないため)、タスクが実行を継続し、完了してデッド アクティビティを更新しようとするため、アプリがクラッシュする可能性がありますか?
本当の質問に来ます:
- アクティビティが強制終了され、onDestroy がスキップされると、そのアクティビティにアタッチされているものはすべて自動的に破棄されますか? (onDestroy は、すべてが完全に消去される場合にのみスキップされますか? タスク、登録済みの受信者など)
- onDestroy がスキップされた場合、これはアプリ全体が強制終了されたことを意味しますか?
ソリューションは onPause() または onStop() にはないため、onDestroy() に注目しましょう。引数:
- onDestroy と同様に、Activity が破棄されているときに onStop() をスキップできます。
- onPause の呼び出しが早すぎて頻繁に呼び出されるため、ユース ケースには適していません。例:
画面ロック: デバイスの画面がロックされているときに onPause を呼び出すことができます。多くの場合、これはスクリーンセーバーのように発生し、ユーザーはそこに立って画面を見ているため、すぐにロックを解除します。このような場合にタスクをキャンセルし、アプリが行っていることをすべて停止すると、ユーザー エクスペリエンスが低下するだけです。偶発的な「スクリーンセーバー」が原因で、アプリがチョークしたり誤動作したりしたくありません。
サンプルアプリには、アクティビティである 2 つの画面があります。ユーザーはそれらをすばやく切り替えることができます。このアプリでは、ユーザーは画面を頻繁かつ迅速に切り替える傾向があります。
ナビゲーション: 画面の 1 つに、システムから更新された位置情報を受け取る地図があります。場所 (ルート) の変更の正確なグラフィカル ログを記録するため、アクティビティが閉じられるまで常に実行する必要があります。通常、onResume と onPause で受信者を登録および登録解除します。ただし、ユーザーが移動するたびにマップの更新が停止するため、アプリが非常に使いにくくなります。そのため、onDestroy で受信者を登録解除したいと考えています。
Loading list : 2 番目の画面には、Web サービスからのデータを表示するリストがあります。データのダウンロードには 4 秒かかります。私は AsyncTask を使用しており、必要に応じてキャンセルする必要があることを知っています。ユーザーが画面を切り替えている間もロードを続行する必要があるため、onPause でキャンセルしないでください。したがって、onDestroy でキャンセルしたいと思います。
もっと多くの例があります。それらのいくつかは、すべての人の意見では完全に適切ではないかもしれません (AsyncTask の代わりにサービスを使用することを提案することさえあります)。しかし、アイデアは重要であり、それらのすべてが同じアイデアを持っています: アクティビティが一時停止している間、アクティビティに固有の作業を続けますが、アクティビティが破棄されたときにそれを停止するようにしてください. (AsyncTask を使用しているか、Service を使用しているかは問題ではありません。いずれの場合も、Activity が破棄された時点で作業を停止する必要があります。)
PS答えがonDestroy でクリーンアップを行うのは安全ではないということである場合、これは Android フレームワークが onPause で行っているすべてのことを停止する必要があることを意味します。そして、onDestroyを使用する理由がわかりません...