Androidアクティビティのライフサイクルは何ですか?なぜこれほど多くの類似した響きの方法(あるonCreate()
、onStart()
、onResume()
初期化時に呼ばれる)は、非常に多くの他のもの(onPause()
、onStop()
、onDestroy()
)最後に呼び出さ?
これらのメソッドはいつ呼び出され、どのように適切に使用する必要がありますか?
Androidアクティビティのライフサイクルは何ですか?なぜこれほど多くの類似した響きの方法(あるonCreate()
、onStart()
、onResume()
初期化時に呼ばれる)は、非常に多くの他のもの(onPause()
、onStop()
、onDestroy()
)最後に呼び出さ?
これらのメソッドはいつ呼び出され、どのように適切に使用する必要がありますか?
回答:
(Android開発者の)Activity Lifecycleで確認してください。
アクティビティが最初に作成されたときに呼び出されます。ここで、通常の静的セットアップ(ビューの作成、データのリストへのバインドなど)をすべて行う必要があります。このメソッドは、アクティビティの以前の凍結状態が含まれている場合は、それを含むバンドルも提供します。常にonStart()が続きます。
アクティビティが停止された後、再開される前に呼び出されます。常にonStart()が続く
アクティビティがユーザーに表示されるときに呼び出されます。アクティビティがフォアグラウンドになった場合は、onResume()が後に続きます。
アクティビティがユーザーとの対話を開始するときに呼び出されます。この時点で、アクティビティはアクティビティスタックの最上位にあり、ユーザー入力がアクティビティスタックに送られます。常にonPause()が続きます。
アクティビティがバックグラウンドに移行するときに、アクティビティライフサイクルの一部として呼び出されますが、(まだ)終了されていません。onResume()に対応するもの。アクティビティBがアクティビティAの前で起動されると、このコールバックはAで呼び出されます。Bは、AのonPause()が戻るまで作成されないため、ここで長いことを行わないでください。
ユーザーから見えなくなったときに呼び出されます。次に、後のユーザーアクティビティに応じて、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アクティビティスタックで最も優先度の高いアクティビティと見なされます。そのため、アクティビティがデバイスで利用可能なメモリよりも多くのメモリを使用しようとすると、UIの原因となる可能性があるため、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は、これらを含む図と、それらがAndroidのフラグメントライフサイクルにどのように関連するかをhttps://github.com/xxv/android-lifecycleで試みました。スティーブの大きな図を改訂してアクティビティ部分のみを含め、レターサイズの1ページ印刷用にフォーマットしました。これをテキストPDFとしてhttps://github.com/code-read/android-lifecycle/blob/master/AndroidActivityLifecycle1.pdfに投稿しました。以下がその画像です。
Androidデベロッパーページから
onPause():
システムが前のアクティビティを再開しようとするときに呼び出されます。これは通常、保存されていない変更を永続データにコミットする、アニメーションを停止するなど、CPUを消費している可能性があるものを停止するために使用されます。このメソッドが戻るまで次のアクティビティは再開されないため、このメソッドの実装は非常に高速でなければなりません。アクティビティが前に戻る場合はonResume()が続き、ユーザーから見えなくなる場合はonStop()が続きます。
onStop():
別のアクティビティが再開され、このアクティビティをカバーしているため、アクティビティがユーザーに表示されなくなったときに呼び出されます。これは、新しいアクティビティが開始されているか、既存のアクティビティがこのアクティビティの前に配置されているか、またはこのアクティビティが破棄されているために発生する可能性があります。このアクティビティがユーザーと対話するために戻ってくる場合はonRestart()が続き、このアクティビティがなくなる場合はonDestroy()が続きます。
ここで、3つのアクティビティがあり、AからBに移動するとします。すると、AのonPauseがBからCに呼び出され、次にonPause of BとonStopが呼び出されます。
一時停止されたアクティビティは再開され、停止されたアクティビティは再開されます。
を呼び出すとthis.finish()
、onPause-onStop-onDestroyが呼び出されます。覚えておかなければならない主なことは、Androidが他の操作にメモリを必要とするときはいつでも、一時停止したアクティビティは停止し、停止したアクティビティは破棄されます。
私はそれが十分に明確であることを望みます。
高評価の回答の上にいくつかの情報を追加します(KILLABLEの追加セクションと次の一連のメソッドを追加しました。これらはライフサイクルで呼び出されます):
上記の表の「Killable」列に注意してください。Killableとしてマークされているメソッドの場合、そのメソッドが返された後、アクティビティをホストしているプロセスは、コードの別の行を実行せずにいつでもシステムによって強制終了される可能性があります。
このため、このonPause()
メソッドを使用して、永続的なデータ(ユーザーの編集など)をストレージに書き込む必要があります。さらに、このメソッドonSaveInstanceState(Bundle)
は、アクティビティをそのようなバックグラウンド状態にする前に呼び出されるため、アクティビティ内の動的インスタンス状態を特定のに保存して、Bundle
後でonCreate(Bundle)
アクティビティを再作成する必要がある場合に受け取ることができます。
中に永続的なデータを保存することが重要であることに注意してくださいonPause()
代わりに、onSaveInstanceState(Bundle)
そのマニュアルに記載されているので、あらゆる状況で呼び出されることはありません後者はライフサイクルコールバックの一部ではないので、。
さらにいくつかのメソッドを追加したいと思います。これらはライフサイクルメソッドとしてリストされていませんが、いくつかの条件によってはライフサイクル中に呼び出されます。要件によっては、状態を適切に処理するために、これらのメソッドをアプリケーションに実装する必要がある場合があります。
onPostCreate(Bundle savedInstanceState)
アクティビティの起動が(後に完了したときに呼び出されます
onStart()
とonRestoreInstanceState(Bundle)
呼ばれています)。
onPostResume()
アクティビティの再開が完了したときに呼び出さ
onResume()
れます(呼び出された後)。
onSaveInstanceState(Bundle outState)
強制終了される前にアクティビティからインスタンスごとの状態を取得するために呼び出され、状態を(
onCreate(Bundle)
またはonRestoreInstanceState(Bundle)
このメソッドによって入力されたバンドルが両方に渡されるように)復元できるようにします。
onRestoreInstanceState(Bundle savedInstanceState)
このメソッドは
onStart()
、アクティビティが以前に保存された状態から再初期化されるときに呼び出されsavedInstanceState
ます。
これらすべてのメソッドを使用する私のアプリケーションコード:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private EditText txtUserName;
private EditText txtPassword;
Button loginButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("Ravi","Main OnCreate");
txtUserName=(EditText) findViewById(R.id.username);
txtPassword=(EditText) findViewById(R.id.password);
loginButton = (Button) findViewById(R.id.login);
loginButton.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Log.d("Ravi", "Login processing initiated");
Intent intent = new Intent(this,LoginActivity.class);
Bundle bundle = new Bundle();
bundle.putString("userName",txtUserName.getText().toString());
bundle.putString("password",txtPassword.getText().toString());
intent.putExtras(bundle);
startActivityForResult(intent,1);
// IntentFilter
}
public void onActivityResult(int requestCode, int resultCode, Intent resIntent){
Log.d("Ravi back result:", "start");
String result = resIntent.getStringExtra("result");
Log.d("Ravi back result:", result);
TextView txtView = (TextView)findViewById(R.id.txtView);
txtView.setText(result);
Intent sendIntent = new Intent();
//sendIntent.setPackage("com.whatsapp");
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "Message...");
sendIntent.setType("text/plain");
startActivity(sendIntent);
}
@Override
protected void onStart() {
super.onStart();
Log.d("Ravi","Main Start");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("Ravi","Main ReStart");
}
@Override
protected void onPause() {
super.onPause();
Log.d("Ravi","Main Pause");
}
@Override
protected void onResume() {
super.onResume();
Log.d("Ravi","Main Resume");
}
@Override
protected void onStop() {
super.onStop();
Log.d("Ravi","Main Stop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("Ravi","Main OnDestroy");
}
@Override
public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onPostCreate(savedInstanceState, persistentState);
Log.d("Ravi","Main onPostCreate");
}
@Override
protected void onPostResume() {
super.onPostResume();
Log.d("Ravi","Main PostResume");
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
}
ログインアクティビティ:
public class LoginActivity extends AppCompatActivity {
private TextView txtView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
txtView = (TextView) findViewById(R.id.Result);
Log.d("Ravi","Login OnCreate");
Bundle bundle = getIntent().getExtras();
txtView.setText(bundle.getString("userName")+":"+bundle.getString("password"));
//Intent intent = new Intent(this,MainActivity.class);
Intent intent = new Intent();
intent.putExtra("result","Success");
setResult(1,intent);
// finish();
}
}
出力:(一時停止前)
D/Ravi: Main OnCreate
D/Ravi: Main Start
D/Ravi: Main Resume
D/Ravi: Main PostResume
出力:(一時停止から再開した後)
D/Ravi: Main ReStart
D/Ravi: Main Start
D/Ravi: Main Resume
D/Ravi: Main PostResume
onPostResume()
ライフサイクルメソッドとして引用されていなくても呼び出されることに注意してください。
上記の回答に従っていくつかのログを実行すると、出力は次のようになります。
開始アクティビティ
On Activity Load (First Time)
————————————————————————————————————————————————
D/IndividualChatActivity: onCreate:
D/IndividualChatActivity: onStart:
D/IndividualChatActivity: onResume:
D/IndividualChatActivity: onPostResume:
Reload After BackPressed
————————————————————————————————————————————————
D/IndividualChatActivity: onCreate:
D/IndividualChatActivity: onStart:
D/IndividualChatActivity: onResume:
D/IndividualChatActivity: onPostResume:
OnMaximize(Circle Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onRestart:
D/IndividualChatActivity: onStart:
D/IndividualChatActivity: onResume:
D/IndividualChatActivity: onPostResume:
OnMaximize(Square Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onRestart:
D/IndividualChatActivity: onStart:
D/IndividualChatActivity: onResume:
D/IndividualChatActivity: onPostResume:
アクティビティを停止する
On BackPressed
————————————————————————————————————————————————
D/IndividualChatActivity: onPause:
D/IndividualChatActivity: onStop:
D/IndividualChatActivity: onDestroy:
OnMinimize (Circle Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onPause:
D/IndividualChatActivity: onStop:
OnMinimize (Square Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onPause:
D/IndividualChatActivity: onStop:
Going To Another Activity
————————————————————————————————————————————————
D/IndividualChatActivity: onPause:
D/IndividualChatActivity: onStop:
Close The App
————————————————————————————————————————————————
D/IndividualChatActivity: onDestroy:
私の個人的な意見では、onStartとonStopの2つだけが必要です。
onResumeは戻ってくるすべてのインスタンスにあり、onPauseは離れるすべてのインスタンスにあるようです(アプリを閉じる場合を除く)。