Android アクティビティのライフサイクルとは? 初期化中に非常に多くの類似したメソッド ( onCreate()
、onStart()
、) が呼び出され、最後に非常に多くのメソッド ( 、 、 ) が呼び出されるのはなぜですか?onResume()
onPause()
onStop()
onDestroy()
これらのメソッドはいつ呼び出され、どのように適切に使用する必要がありますか?
Activity Lifecycle (at Android Developers) でそれを参照してください。
アクティビティが最初に作成されたときに呼び出されます。ビューの作成、リストへのデータのバインドなど、通常の静的設定はすべてここで行う必要があります。このメソッドは、アクティビティの以前に凍結された状態があれば、それを含むバンドルも提供します。常に onStart() が続きます。
アクティビティが停止された後、再開される前に呼び出されます。常に onStart() が続きます
アクティビティがユーザーに表示されるようになったときに呼び出されます。アクティビティがフォアグラウンドになった場合、onResume() が続きます。
アクティビティがユーザーとの対話を開始するときに呼び出されます。この時点で、アクティビティはアクティビティ スタックの一番上にあり、ユーザー入力がそこに送られます。常に onPause() が続きます。
アクティビティがバックグラウンドに移行するときに、アクティビティ ライフサイクルの一部として呼び出されますが、(まだ) 強制終了されていません。onResume() に対応するものです。アクティビティ B がアクティビティ A の前に起動されると、このコールバックが A で呼び出されます。B は、A の onPause() が戻るまで作成されないため、ここで長いことを行わないようにしてください。
onStop() :
ユーザーから見えなくなったときに呼び出されます。その後のユーザー アクティビティに応じて、次に onRestart()、onDestroy() を受け取るか、何も受け取りません。このメソッドは、onPause() メソッドが呼び出された後にアクティビティのプロセスを実行し続けるための十分なメモリがシステムにないメモリ不足の状況では呼び出されないことに注意してください。
アクティビティが破棄される前に受け取る最後の電話。これは、アクティビティが終了している (finish() が呼び出された) ため、またはシステムがスペースを節約するためにアクティビティのこのインスタンスを一時的に破棄しているために発生する可能性があります。これら 2 つのシナリオは、isFinishing() メソッドで区別できます。
アクティビティが初めてロードされると、イベントは次のように呼び出されます。
onCreate()
onStart()
onResume()
電話ボタンをクリックすると、アクティビティがバックグラウンドになり、以下のイベントが呼び出されます。
onPause()
onStop()
電話ダイヤラーを終了すると、以下のイベントが呼び出されます。
onRestart()
onStart()
onResume()
戻るボタンをクリックするか、アクティビティを終了()しようとすると、イベントが次のように呼び出されます。
onPause()
onStop()
onDestroy()
Android OS は、優先キューを使用して、デバイスで実行されているアクティビティの管理を支援します。特定の Android アクティビティの状態に基づいて、OS 内で特定の優先度が割り当てられます。この優先順位システムは、Android が使用されなくなったアクティビティを識別するのに役立ち、OS がメモリとリソースを再利用できるようにします。次の図は、アクティビティが存続期間中に通過できる状態を示しています。
これらの状態は、次の 3 つの主要なグループに分けることができます。
アクティブまたは実行中- アクティビティは、アクティビティ スタックの最上位とも呼ばれるフォアグラウンドにある場合、アクティブまたは実行中と見なされます。これは、Android アクティビティ スタックで最も優先度の高いアクティビティと見なされます。そのため、極端な状況でのみ OS によって強制終了されます。たとえば、アクティビティがデバイスで利用可能なメモリよりも多くのメモリを使用しようとした場合などです。無反応になる。
一時停止- デバイスがスリープ状態になるか、アクティビティがまだ表示されているが、フルサイズではない新しいアクティビティまたは透明なアクティビティによって部分的に隠されている場合、アクティビティは一時停止と見なされます。つまり、すべての状態とメンバーの情報を維持し、ウィンドウ マネージャーに接続されたままになります。これは、Android アクティビティ スタックで 2 番目に優先度の高いアクティビティと見なされます。そのため、このアクティビティを強制終了することが、アクティブ/実行中のアクティビティを安定して応答性を維持するために必要なリソース要件を満たす場合にのみ、OS によって強制終了されます。
停止- 別のアクティビティによって完全に隠されているアクティビティは、停止またはバックグラウンドであると見なされます。停止されたアクティビティは、可能な限りその状態とメンバー情報を保持しようとしますが、停止されたアクティビティは 3 つの状態の中で最も優先度が低いと見なされます。そのため、OS はリソース要件を満たすために、この状態のアクティビティを最初に強制終了します。より優先度の高い活動の。
*ライフサイクルを理解するためのサンプルアクティビティ**
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
String tag = "LifeCycleEvents";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(tag, "In the onCreate() event");
}
public void onStart()
{
super.onStart();
Log.d(tag, "In the onStart() event");
}
public void onRestart()
{
super.onRestart();
Log.d(tag, "In the onRestart() event");
}
public void onResume()
{
super.onResume();
Log.d(tag, "In the onResume() event");
}
public void onPause()
{
super.onPause();
Log.d(tag, "In the onPause() event");
}
public void onStop()
{
super.onStop();
Log.d(tag, "In the onStop() event");
}
public void onDestroy()
{
super.onDestroy();
Log.d(tag, "In the onDestroy() event");
}
}
アクティビティには 6 つの状態があります
アクティビティのライフサイクルには 7 つのメソッドがあります
onCreate()
onStart()
onResume()
onPause()
onStop()
onRestart()
onDestroy()
状況
アプリを開くと
onCreate() --> onStart() --> onResume()
戻るボタンを押してアプリを終了したとき
onPaused() -- > onStop() --> onDestory()
ホームボタンを押したところ
onPaused() --> onStop()
ホームボタンを押した後、最近のタスクリストからアプリを再度開いたり、アイコンをクリックしたりした後
onRestart() --> onStart() --> onResume()
通知バーから別のアプリを開くか、設定を開くと
onPaused() --> onStop()
別のアプリまたは設定から戻るボタンを押してから使用すると、アプリが表示されます
onRestart() --> onStart() --> onResume()
画面上にダイアログが開いたとき
onPause()
ダイアログを閉じた後、またはダイアログから戻るボタン
onResume()
任意の電話が鳴っており、アプリ内のユーザー
onPause() --> onResume()
ユーザーが電話の応答ボタンを押したとき
onPause()
通話終了後
onResume()
電話画面がオフのとき
onPaused() --> onStop()
画面がオンに戻ったとき
onRestart() --> onStart() --> onResume()
Google が次のようなものではなく、直感的でない名前を選択したため、全体的な混乱が生じています。
onCreateAndPrepareToDisplay() [instead of onCreate() ]
onPrepareToDisplay() [instead of onRestart() ]
onVisible() [instead of onStart() ]
onBeginInteraction() [instead of onResume() ]
onPauseInteraction() [instead of onPause() ]
onInvisible() [instead of onStop]
onDestroy() [no change]
アクティビティ図は次のように解釈できます。
Android アプリケーションのライフサイクルを管理する方法は 7 つあります。
これらのメソッドが呼び出される順序を知ることで、これらのメソッドが使用される理由を明確にするのに役立つ簡単なシナリオを考えてみましょう。
onCreate()
- - - > - - - >onStart()
onResume()
onPause()
- - - > onStop()
onRestart()
- - - > - - - >onStart()
onResume()
onStop()
- - - > onDestroy()
開始状態は次のとおりです。
新しい Linux プロセスを作成し、新しい UI オブジェクトに新しいメモリを割り当て、画面全体をセットアップします。したがって、ほとんどの作業はここで行われます。
実行中の状態は次のとおりです。
現在画面上にあるアクティビティ (状態) です。この状態だけで、画面への入力、ボタンのタッチとクリックなどを処理します。
一時停止状態には次のものが含まれます。
アクティビティがフォアグラウンドではなくバックグラウンドにある場合、そのアクティビティは一時停止状態にあると言われます。
停止状態には以下が含まれます。
停止したアクティビティは、再起動することによってのみフォアグラウンドに移行でき、いつでも破棄できます。
アクティビティ マネージャーは、新しいアクティビティが既存のアクティビティに追加されるシナリオでも、ユーザー エクスペリエンスとパフォーマンスが常に最高になるように、これらすべての状態を処理します。
この質問とその回答は気に入っていますが、これまでのところ、onPostCreate()やonPostResume( ) などの使用頻度の低いコールバックについては取り上げていません。Steve Pomeroy は、 https://github.com/xxv/android-lifecycleで、これらと Android のFragmentライフサイクルとの関係を含む図を試みました。スティーブの大きな図を修正して、アクティビティ部分のみを含め、レター サイズの 1 ページの印刷用に書式設定しました。https://github.com/code-read/android-lifecycle/blob/master/AndroidActivityLifecycle1.pdfにテキスト PDF として投稿しました。以下はその画像です。
Android デベロッパー ページから、
onPause():
システムが以前のアクティビティの再開を開始しようとしているときに呼び出されます。これは通常、保存されていない変更を永続データにコミットしたり、アニメーションやその他の CPU を消費する可能性があるものを停止したりするために使用されます。このメソッドが戻るまで次のアクティビティが再開されないため、このメソッドの実装は非常に迅速である必要があります。アクティビティが前面に戻った場合は onResume() が続き、ユーザーから見えなくなった場合は onStop() が続きます。
onStop():
別のアクティビティが再開され、このアクティビティをカバーしているため、アクティビティがユーザーに表示されなくなったときに呼び出されます。これは、新しいアクティビティが開始されているか、既存のアクティビティがこのアクティビティの前に移動されているか、またはこのアクティビティが破棄されているために発生する可能性があります。このアクティビティがユーザーと対話するために戻ってくる場合は onRestart() が続き、このアクティビティがなくなる場合は onDestroy() が続きます。
ここで、3 つのアクティビティがあり、A から B に移動するとします。次に、A の onPause が B から C に呼び出され、次に B の onPause と A の onStop が呼び出されます。
一時停止されたアクティビティは再開され、停止されたアクティビティは再開されます。
を呼び出すとthis.finish()
、onPause-onStop-onDestroy が呼び出されます。覚えておくべき主なことは、Android が他の操作のためにメモリを必要とするたびに、一時停止されたアクティビティが停止され、停止されたアクティビティが破棄されることです。
十分に明確であることを願っています。