どういう意味ですか、なぜonCreate()
が再び呼び出されないのですか?
簡単な答え:画面が消えたときにあなたの活動が破壊されていないので、onCreate()
を再度呼び出す理由はありません。
電話機の画面がオフになると、アクティビティのonPause()
コールバックが呼び出され、その後にonStop()
が続きます。しかし、それがonStop()
に届いたからといって、それがいつもonDestroy()
に達するというわけではありません。少なくとも私の理解では、AndroidのOSはできるだけ多くのメモリを使用してアプリケーションのバックアップを高速化するなどの試みを行っています(これは単純化されたものですが、一般的な考えです)。これは、画面が消えても(少なくとも最初は)あなたのアクティビティがメモリに残っていることを意味します。あなたのアクティビティが保持するリソースがシステムに本当に必要な場合にのみ、アクティビティのonDestroy()
が呼び出されます。そのため、画面をオフにしても、ボタンのクリックリスナーは機能します。あなたのアクティビティはまだメモリに残っています。つまり、ボタンリスナーもまだ登録されています。
スリープモードと画面をオフにすることは同じことではないことを指摘することが重要です。画面をオフにすると、すぐにスリープモードになることがあります。画面が消えてもまだスリープモードにならないときは、CPUはまだ動作しており、サービスはまだ実行されています。電話機がスリープモードになると、CPUの電源が切れ、すべてのプロセスが本質的に「フリーズ」し、結果としてすべてservices
となります。ウォークロックを使用すると、電話機がスリープモードになるのを防ぐことができます。これは、電話機の画面が長時間オフになっている間もサービスが実行される理由です。あなたがまだそれを読んでいないなら、Service
referenceはかなり良い情報を持っています。また、Androidのメモリ使用量をどのように優先させるかについても説明しています。
最終的にはどうしますか? –
確かに、私が欲しいものですが、私の質問は何が起こっているのかです。ハンドラとスレッドが破壊されなければ、Android(またはハードウェア)はすべてのプロセスの状態を「一時停止」することができます(AlarmManagerのようなものを除いて)。スリープモードから復帰する。私はこれが、バッテリを節約するためにデバイスのアーキテクチャによってのみ可能であると考えています。本当に興味深いのは、これが真実なら、なぜスリープモードから出るときにバックグラウンドサービスが生き残っていないかということです。彼らは実際にスリープモード中に殺されることができます。 – AndroidDev