Androidアクティビティのライフサイクルは?初期化中に、なぜそんなに多くの類似のメソッド(onCreate()
、onStart()
、onResume()
)が呼び出され、その他の多くのメソッド(onPause()
、onStop()
、onDestroy()
)が最後に呼び出されるのでしょうか。
これらのメソッドはいつ呼び出され、どのように適切に使用されるべきですか?
Activity Lifecycle(Android Developers)でそれを参照してください。
アクティビティが最初に作成されたときに呼び出されます。ビューの作成、リストへのデータのバインドなど、これで通常の静的設定をすべて行う必要があります。この方法では、アクティビティの以前の凍結状態が含まれている場合はそれを含むBundleも提供されます。常にonStart()が後に続きます。
活動が停止した後、再開される前に呼び出されます。常にonStart()が後に続きます
ユーザーにアクティビティが見えるようになったときに呼び出されます。アクティビティが前面に来る場合はonResume()が続きます。
アクティビティがユーザーとの対話を開始するときに呼び出されます。この時点で、あなたのアクティビティはアクティビティスタックの一番上にあり、ユーザ入力がそれに行きます。常にonPause()が後に続きます。
アクティビティがバックグラウンドで実行されているが、(まだ)殺されていない場合に、アクティビティライフサイクルの一部として呼び出されます。 onResume()の対応物です。アクティビティBがアクティビティAの前で起動されると、このコールバックはAで呼び出されます。AのonPause()が返されるまでBは作成されません。そのため、ここでは何もしないでください。
ユーザーから見えなくなったときに呼び出されます。その後のユーザーアクティビティに応じて、onRestart()、onDestroy()、または何も受信しません。 onPause()メソッドが呼び出された後にアクティビティのプロセスを実行し続けるのに十分なメモリがシステムにない場合、このメソッドは決して呼び出されないことに注意してください。
あなたの活動が破壊される前にあなたが受ける最後の電話。これは、アクティビティが終了している(誰かがfinish()を呼び出した)か、スペースを節約するためにシステムがアクティビティのこのインスタンスを一時的に破棄しているために発生する可能性があります。
Activity 初回ロード時の場合、イベントは以下のように呼び出されます。
onCreate()
onStart()
onResume()
あなたが電話ボタンをクリックの時)アクティビティは背景に行き、以下のイベントが呼ばれます。
onPause()
onStop()
phone dialerを終了すると、以下のイベントが呼び出されます。
onRestart()
onStart()
onResume()
戻るボタンORをクリックすると、finish()とします)イベントは以下のように呼び出されます。
onPause()
onStop()
onDestroy()
Android OSは、デバイス上で実行されているアクティビティの管理を支援するためにプライオリティキューを使用します。特定のAndroidアクティビティが存在する状態に基づいて、OS内で特定の優先順位が割り当てられます。この優先システムは、Androidが使用されなくなったアクティビティを識別するのに役立ち、OSがメモリとリソースを再利用できるようにします。次の図は、アクティビティが存続期間中に通過できる状態を示しています。
これらの状態は、次のように3つの主なグループに分けられます。
アクティブまたは実行中 - アクティビティーは、フォアグラウンドにある場合はアクティブまたは実行中と見なされ、アクティビティー・スタックの最上位とも呼ばれます。これは、Androidアクティビティー・スタックで最も優先順位の高いアクティビティーと見なされます。 UIが応答しなくなる可能性があるため、アクティビティがデバイスで利用可能な量より多くのメモリを使用しようとした場合など、極端な状況ではOSによって強制終了されます。
Paused - デバイスがスリープ状態になったとき、またはアクティビティが表示されているがフルサイズではない、または透過的な新しいアクティビティによって部分的に隠されている場合、アクティビティは一時停止したと見なされます。これは、Androidアクティビティスタックで2番目に優先度の高いアクティビティと見なされ、このアクティビティを強制終了しても次の条件を満たす場合にのみOSによって強制終了されます。アクティブ/ランニングアクティビティを安定した応答性を保つために必要なリソース要件。
Stopped - 他のアクティビティによって完全に隠されているアクティビティは、停止またはバックグラウンドであると見なされます。まだ停止されたアクティビティは、その状態とメンバー情報をできるだけ長く保持しようとします。 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");
}
}
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]
アクティビティ図は次のように解釈できます。
活動には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()
Androidアプリケーションのライフサイクルを管理する方法は7つあります。
これらのメソッドがどの順序で呼び出されるのかを知ることが、なぜそれらが使われるのかを明確にするのに役立つという単純なシナリオを考えましょう。
onCreate()
- - - > onStart()
- - - > onResume()
onPause()
- - - > onStop()
onRestart()
- - - > onStart()
- - - > onResume()
onStop()
- - - > onDestroy()
開始状態は次のとおりです。
新しいLinuxプロセスを作成し、新しいUIオブジェクトに新しいメモリを割り当て、画面全体を設定します。そのため、ほとんどの作業はここで行われます。
実行状態は次のとおりです。
現在画面に表示されているのはアクティビティ(状態)です。この状態だけでも、画面への入力、ボタンのタッチ&クリックなどの処理が行われます。
一時停止状態は次のとおりです。
アクティビティがフォアグラウンドになくバックグラウンドにある場合、アクティビティは一時停止状態にあると言われます。
停止状態には以下が含まれます。
停止したアクティビティは、それを再起動することによってのみフォアグラウンドで購入することができ、また、いつでも破壊することができます。
アクティビティマネージャは、新しいアクティビティが既存のアクティビティに追加されるシナリオでも、ユーザーエクスペリエンスとパフォーマンスが常に最高になるように、これらすべての状態を処理します。
私はこの質問とそれに対する答えが好きですが、今のところonPostCreate()やonPostResume())のように使用頻度の低いコールバックについては取り上げません。 https://github.com/xxv/Android-lifecycle で、これらとそれらがAndroidのFragmentライフサイクルにどのように関連するかを含む図を試みました。私はのみを含むようにSteveの大きな図を修正しました。 Activity部分をレターサイズの1ページ印刷用にフォーマットし、PDFに https://github.com/code-read/Android-lifecycle/blobとして投稿しました。 /master/AndroidActivityLifecycle1.pdf 以下がそのイメージです。
Android Developersページから、
onPause():
システムが前のアクティビティの再開を開始しようとしているときに呼び出されます。これは通常、保存されていない変更を永続データにコミットしたり、アニメーションを停止したり、CPUを消費する可能性があるその他のことを停止するために使用されます。アクティビティが前面に戻る場合はonResume()が続き、ユーザに見えなくなった場合はonStop()が続きます。
onStop():
別のアクティビティが再開され、このアクティビティをカバーしているために、アクティビティがユーザに表示されなくなったときに呼び出されます。これは、新しい活動が開始されている、既存の活動がこの活動の前に持ち込まれている、またはこの活動が破壊されているために発生する可能性があります。このアクティビティがユーザと対話するために戻ってきている場合はonRestart()が続き、このアクティビティがなくなっている場合はonDestroy()が続きます。
3つのアクティビティがあり、AからBに移動し、AのonPauseがBからCに呼び出され、次にBのonPauseとAのonStopが呼び出されるとします。
一時停止したアクティビティは再開し、停止したアクティビティは再開されます。
this.finish()
を呼び出すと、onPause-onStop-onDestroyが呼び出されます。覚えておくべき主なことは次のとおりです。Androidが他の操作のためにメモリを必要とするときはいつでも、一時停止したアクティビティは停止し、停止したアクティビティは破棄されます。
私はそれが十分に明確であることを望みます。
高評価の回答の上にさらに情報を追加します(ライフサイクルの中で呼ばれる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)
で復元できるように、killされる前にアクティビティからインスタンスごとの状態を取得するために呼び出されます(このメソッドによって生成された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()
が呼び出されることに注意してください。
アプリケーションを起動します。
ユーザーが初めてアクティビティまたはアプリケーションに入るとき:
onCreate(),
onStart() and
onResume()
あなたがAndroidのスタジオからアプリを実行すると:
onCreate(),
onStart() and
onResume()
活動推移:
ファーストアクティビティ - >セカンドアクティビティから移動する場合
first_activity : onPause()
second_activity : onCreate()
second_activity : onStart()
second_activity : onResume()
first_activity : onStop()
セカンドアクティビティ - >ファーストアクティビティから移動する場合
second_activity : onPause()
first_activity : onRestart()
first_activity : onStart()
first_activity : onResume()
second_activity : onStop()
second_activity : onDestroy()
概要ボタン:
ユーザーがOverviewボタン(ハードウェアの3番目のボタン - 最近のリスト)をクリックしたとき:
onPause()
onStop()
ユーザーが概要ボタンを消した後(または)ユーザーが最近のリストから他のアプリケーションにアクセスしてアプリケーションに戻った。
onRestart()
onStart()
onResume()
ホームボタン:
ユーザーがホームボタンをクリックしたとき:
onPause()
onStop()
ユーザーがホーム画面を検索し、アプリケーションのアイコンをクリックしてアクティビティに戻ります。
onRestart()
onStart()
onResume()
ユーザーは電話を受けます:
ユーザーがアクティビティに参加すると、電話がかかってきました。
onPause()
onStop()
ユーザーが通話に参加しない場合は、自動的に切断されてアクティビティに戻ります(不在着信)。
onRestart()
onStart()
onResume()
ユーザーが電話に出ない場合:
N/A - ライフサイクルは呼び出されません。
電源オフボタン:
ユーザーがボタンをオフにしたとき:
onPause()
onStop()
デバイスのロックを解除すると
onRestart()
onStart()
onResume()
ポップアップダイアログ:
ポップアップダイアログが表示されたとき - ライフサイクルは呼び出されません
デバイスを再起動するか、スイッチをオフにします。
ユーザーがデバイスを再起動または電源を切ったとき
onPause()
onStop()
ユーザーがホーム画面からアプリのアイコンをクリックしたとき:
onCreate()
onStart()
onResume()