10

If an activity is being shown on the screen and has a button with a click listener attached to it, that gets attached to the button during the onCreate method, and then the device goes into sleep mode (or the user taps on the power button to turn off the screen), when the screen comes back on the activity is still visible as it was prior to going into sleep mode.

The onResume gets called, which is documented as part of the lifecycle for an activity. What I don't understand is why the onCreate doesn't get called again. How is it possible for the button's click listener to even function after coming out of sleep mode? You would think that Android has destroyed all running processes attached to the activity which includes the button's click listener.

4

5 に答える 5

3

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

簡単な答え: 画面がオフになったときにアクティビティが破棄されていないため、onCreate()再度呼び出される理由はありません。

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

スリープモードと画面をオフにすることは同じことではないことを指摘することが重要だと思います. 画面をオフにすると、すぐにスリープ モードになる場合とそうでない場合があります。画面が消えてもまだスリープ モードに移行していない場合、CPU はまだ動作しており、サービスはまだ実行されています。電話がスリープ モードになると、CPU の電源がオフになり、基本的にすべてのプロセスが「フリーズ」し、結果としてすべてのプロセスも停止しますservices。ウェイクロックを使用すると、電話機がスリープ モードに入るのを防ぐことができます。これにより、電話機の画面が長時間オフになっていてもサービスが実行されます。まだ読んでいない場合は、Service参考文献 にかなりの情報があります。また、そのライフサイクルと、Android がメモリ使用量をどのように優先するかについても説明します。

于 2013-07-06T07:17:33.853 に答える
1

Android のアクティビティ ライフサイクルは非常に複雑であり、Romain Guy でさえ、長年 Android のコア開発を行ってきたにもかかわらず、完全には理解していないと述べています。Android OS がアクティビティのライフサイクルに干渉する可能性があると想定できます。アクティビティのライフサイクルは、実際の動作を非常に大まかに表しているにすぎません。ほとんどの場合、経験と試行錯誤を通じて理解しました。

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

サービスの場合も同じです。通常、サービスは長時間実行されるべきではなく、完了したらすぐに停止する必要があります。そのため、OS がバックグラウンドで長時間実行されているサービスを見つけた場合、任意の時間が経過するとバッテリー/RAM を節約するためにそのサービスを削除しようとします (この決定には他のパラメーターも含まれる可能性があります)。一方、長時間実行されるサービスが必要な場合は、手動でウェイクロックを維持して OS に「何があってもこれを行う必要があります」というシグナルを送信する必要があります。

于 2013-07-06T13:23:27.107 に答える
0

電源ボタンまたはホーム ボタンを押すと、Android OS は現在のアクティビティをバック スタックに配置します。同じアクティビティに戻るため、ページを作成したときにのみ、そのページに来るたびにメモリを割り当てる必要がないようにシステムが機能します。 onResume が呼び出されます。Android はモバイル オペレーティング システムであるため、Memroy Management は非常に重要です。

于 2013-07-06T13:48:36.487 に答える
0

簡単な答え: が作成されonCreate()たときに呼び出されます。Activityデバイスがスリープに入ってから復帰する動作は、onPause()and onResume()call として定義されます。デバイスがスリープ状態になっても、アプリやアクティビティが強制終了されることはありません。状態は (ほぼ) 同じままです。

于 2014-01-30T00:27:18.363 に答える