2013-07-06 45 views
8

アクティビティが画面に表示されていて、クリックリスナが付いたボタンがある場合、onCreateメソッドでボタンにアタッチされ、スリープ状態になりますモード(または電源ボタンをタップして画面をオフにする)を選択すると、画面が再び表示されると、アクティビティはスリープモードに移行する前の状態のままで表示されます。スリープ状態から復帰した後のAndroidのアクティビティライフサイクル

onResumeが呼び出され、アクティビティのライフサイクルの一部として文書化されます。私が理解できないことは、なぜonCreateが再び呼び出されないのかです。スリープモードから抜け出した後、ボタンのクリックリスナはどのように機能するのですか? Androidは、ボタンのクリックリスナーを含むアクティビティに添付されている実行中のプロセスをすべて破棄したと考えられます。

+0

最終的にはどうしますか? –

+1

確かに、私が欲しいものですが、私の質問は何が起こっているのかです。ハンドラとスレッドが破壊されなければ、Android(またはハードウェア)はすべてのプロセスの状態を「一時停止」することができます(AlarmManagerのようなものを除いて)。スリープモードから復帰する。私はこれが、バッテリを節約するためにデバイスのアーキテクチャによってのみ可能であると考えています。本当に興味深いのは、これが真実なら、なぜスリープモードから出るときにバックグラウンドサービスが生き残っていないかということです。彼らは実際にスリープモード中に殺されることができます。 – AndroidDev

答えて

1

どういう意味ですか、なぜonCreate()が再び呼び出されないのですか?

簡単な答え:画面が消えたときにあなたの活動が破壊されていないので、onCreate()を再度呼び出す理由はありません。

電話機の画面がオフになると、アクティビティのonPause()コールバックが呼び出され、その後にonStop()が続きます。しかし、それがonStop()に届いたからといって、それがいつもonDestroy()に達するというわけではありません。少なくとも私の理解では、AndroidのOSはできるだけ多くのメモリを使用してアプリケーションのバックアップを高速化するなどの試みを行っています(これは単純化されたものですが、一般的な考えです)。これは、画面が消えても(少なくとも最初は)あなたのアクティビティがメモリに残っていることを意味します。あなたのアクティビティが保持するリソースがシステムに本当に必要な場合にのみ、アクティビティのonDestroy()が呼び出されます。そのため、画面をオフにしても、ボタンのクリックリスナーは機能します。あなたのアクティビティはまだメモリに残っています。つまり、ボタンリスナーもまだ登録されています。

スリープモードと画面をオフにすることは同じことではないことを指摘することが重要です。画面をオフにすると、すぐにスリープモードになることがあります。画面が消えてもまだスリープモードにならないときは、CPUはまだ動作しており、サービスはまだ実行されています。電話機がスリープモードになると、CPUの電源が切れ、すべてのプロセスが本質的に「フリーズ」し、結果としてすべてservicesとなります。ウォークロックを使用すると、電話機がスリープモードになるのを防ぐことができます。これは、電話機の画面が長時間オフになっている間もサービスが実行される理由です。あなたがまだそれを読んでいないなら、Service referenceはかなり良い情報を持っています。また、Androidのメモリ使用量をどのように優先させるかについても説明しています。

+0

あなたの説明では、画面が十分に長い間オフになったときにサービスが強制終了する理由を説明しません。アクティビティのプロセスが元のままで、スクリーンが再びオンになったときに復元される理由に関する説明とは関係がないので、ウォークロックについては忘れてください。 – AndroidDev

+0

デバイスがメモリを必要とする場合、プロセス全体が終了する可能性があります。これには、あなたの活動とサービスが含まれます。この回答で述べたように、デバイスがスリープ状態になるたびにこれが起こることは保証されていません。この答えで言われたことに反して、プロセスが強制終了されたときにonDestroy()が呼び出されないことがあります。 – AsafK

0

Androidのアクティビティライフサイクルは極端に複雑で、さらに多くの年のアンドロイド開発の後にRomain Guy states he doesn't understand it fullyさえあります。 Android OSは、バックグラウンドになっているときにどのように見えるか、アクティビティのライフサイクルに影響すると想定できます。 activity lifecycleは、実際の行動を非常に大まかに表しています。ほとんどの場合、私は経験とトレイルとエラーで私の理解を得ました。

アクティビティをバックグラウンドで送信した場合、アンドロイドに使用可能なRAMがある場合は、RAMにアクティビティを保存しようとするので、onPauseとonStopを経由します。この状態は、あなたがあなたのアプリケーションに戻るまで持続することができます。その後、onStartとonResumeを経由します。なぜなら、onCreateで作成したすべての参照/フィールドがまだ存在し、再利用できるからです。一方、OSがより多くのメモリを必要とすると判断した場合は、あなたの活動を破壊し、ガベージコレクションのためにオープンされ、onDestroy()ライフサイクルを経ます。次回にアプリケーションを開くと、onSaveInstanceState()に保存された状態で新しいアクティビティが作成され、onCreate()のライフサイクル全体が

まで実行されます。通常、サービスは長時間実行されてはならず、完了後直ちに停止する必要があります。したがって、OSがバックグラウンドで長時間実行されるサービスを見つけた場合、時間の余裕があればバッテリー/ RAMを節約するためにそのサービスを取り除こうとします(おそらく他のパラメータもこの決定に含まれます)。一方、長時間実行されるサービスが必要な場合は、手動でwakelockをsginalに保つ必要があります。「何を問わず、これを実行する必要があります。

+0

ロメインの声明へのリンクの更新はありますか?読めるような宝石だろうが、悲しいかな、私たちはできない! – user3175580

0

あなたが電源ボタンまたはホームボタンを押すと、アンドロイドOSが現在のアクティビティをバックスタックに配置します。 onCreateが再び呼び出される理由は、ビューを作成して、 xmlレイアウトをアクティビティに追加する必要があります。システムは、同じアクティビティに戻って再開するため、page.onResumeが作成されたときにのみ、そのページに来るたびにメモリを割り当てる必要はありません。 Memroy Managmentはモバイルオペレーティングシステムであるため、Androidでは非常に重要です。

+0

必要な場合、またはこの回答があなたの疑いを狙っていないと思われる場合は、さらに明確にしてください。 –

+0

私は家を押したり、電源ボタンを押しても、現在のアクティビティはバックスタックに置かれないと思います。 – for3st

+0

これを実行しているときにonPauseメソッドが呼び出されると、それはDVMが バックスラックに現在のアクティビティを配置していることを意味します。 このリンクがあなたの疑問を解決するかもしれない、 http://stackoverflow.com/questions/5001682/android-memory-management-in-activity-lifecycle アクティビティのライフサイクルとメモリ管理に関するマイケルの答えを参照してください。 –

0

短い回答:Activityが作成されると、 onCreate()が呼び出されます。 デバイスがスリープ状態に移行して復帰する動作は、onPause()onResume()コールと定義されています。デバイススリープはアプリを殺したり、アクティビティ状態を(ほぼ)維持しません。

関連する問題