Androidアクティビティのライフサイクル-これらすべての方法は何ですか?


420

Androidアクティビティのライフサイクルは何ですか?なぜこれほど多くの類似した響きの方法(あるonCreate()onStart()onResume()初期化時に呼ばれる)は、非常に多くの他のもの(onPause()onStop()onDestroy())最後に呼び出さ?

これらのメソッドはいつ呼び出され、どのように適切に使用する必要がありますか?


17
この質問が何度も賛成されているのはなぜですか?なぜ閉鎖されていないのですか?
Alexander Kulyakhtin 2013年

54
なぜ多くの賛成票で質問を閉じるのですか?Stackoverflowにはその悪い癖があります。
ディックルーカス

12
これはウィキスタイルの質問で、サイトでは許可されるべきだと思います。
Mateen Ulhaq 2014年

2
@Alexander Kulyakhtin-なぜこの質問を閉じるのですか?新しいAndroidユーザー向けの回答で提供される情報を要約できない場合は、代わりにアカウントを閉鎖する必要があります。この質問には知識が豊富で、私はこの質問に賛成票を投じます。
スタックオーバーフロー

これらのメソッドが質問と呼ばれるのはいつですか、何を試しましたか?
Sreekanth Karumanaghat

回答:


748

(Android開発者の)Activity Lifecycleで確認してください。

ここに画像の説明を入力してください

onCreate()

アクティビティが最初に作成されたときに呼び出されます。ここで、通常の静的セットアップ(ビューの作成、データのリストへのバインドなど)をすべて行う必要があります。このメソッドは、アクティビティの以前の凍結状態が含まれている場合は、それを含むバンドルも提供します。常にonStart()が続きます。

onRestart()

アクティビティが停止された後、再開される前に呼び出されます。常にonStart()が続く

onStart()

アクティビティがユーザーに表示されるときに呼び出されます。アクティビティがフォアグラウンドになった場合は、onResume()が後に続きます。

onResume()

アクティビティがユーザーとの対話を開始するときに呼び出されます。この時点で、アクティビティはアクティビティスタックの最上位にあり、ユーザー入力がアクティビティスタックに送られます。常にonPause()が続きます。

onPause()

アクティビティがバックグラウンドに移行するときに、アクティビティライフサイクルの一部として呼び出されますが、(まだ)終了されていません。onResume()に対応するもの。アクティビティBがアクティビティAの前で起動されると、このコールバックはAで呼び出されます。Bは、AのonPause()が戻るまで作成されないため、ここで長いことを行わないでください。

onStop()

ユーザーから見えなくなったときに呼び出されます。次に、後のユーザーアクティビティに応じて、onRestart()、onDestroy()、または何も受け取りません。onPause()メソッドが呼び出された後にアクティビティのプロセスを実行し続けるのに十分なメモリがシステムにないメモリ不足の状況では、このメソッドが呼び出されることはありません。

onDestroy()

アクティビティが破棄される前に受け取る最後の呼び出し。これは、アクティビティが終了している(誰かがアクティビティの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");
    }
}

1
だから私がそれを正しく理解していれば、onStop()は常にonPause()の後に呼び出されますか?
Titouan de Bailleul 2012

4
常にではない、「onStop():ユーザーから見えなくなったときに呼び出される」
Yaqub Ahmad

2
onCreateの前に呼び出される可能性のあるものはありますか?
NodeDad 2013

6
はい、あります-デフォルトのコンストラクター(パラメーターがないもの)です。ただし、非常に基本的な初期化の目的での使用は非常に限られています。通常、何をしているのか本当に理解していない場合は、使用しないでください。それでも、物事を行うためのより良い方法があるかどうかをよく考えるべきです。
Mjoellnir、2015

1
このリンクは、アクティビティのライフサイクルをよりよく理解するのに役立つと思います。iphtechnologies.com/understanding-lifecycle-in-android-activity
Ashish Kumar Mishra

162

アクティビティには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()

6
「画面上でダイアログが開いているとき、onPause()が呼び出されます」は、アラートダイアログではtrueになりません。ダイアログ自体がダイアログアクティビティである場合にのみ呼び出されます(テーマが@android:style / Theme.Dialogに設定されています)。
gaurav jain 2016年

2
貴重な答え。これをgoogleに送信して、ドキュメントに追加してください。Word文書への回答を保存して保存します!
likejudo

「どの電話でも鳴っており、アプリ内のユーザー」が理解できません。正確にはどのようなシナリオですか?私が最初にしたのは、ユーザーがアプリ内にいて電話が鳴り始めた場合で、全画面が通話になった場合のonPause()-> onStop()になります。ヘッドアップの場合、着信メッセージはOnResume-> onPause()だけかもしれませんが、私にはわかりません。onPause-> onResumeの呼び出しの状況はどうですか?通話終了ですか?
Sotti、2016年

これは私が探していたものです。私のapi呼び出しをどこに置くべきか知りたいだけでした。
ハイゼンベルク2017

私はあなたのシナリオベースの答えが好きでした。
コカビ2017

155

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] 

アクティビティ図は次のように解釈できます。

ここに画像の説明を入力してください


1
依存します。それが混乱を解決しない限り、長い名前は傷つかない。例:onRoutePresentationDisplayChanged()は、Android SDK内の関数です
Nilesh Pawar

12
私は個人的にあなたの名前が非常に直感的であるとは思いません。さらに、Fragmentsを使用すると、実際には相関しません。
Martin Marconcini、2013

9
賛成。公式ドキュメントよりも役立つ
bad_keypoints 14

3
その素晴らしい投稿。1つの問題。GoogleにAndoidライフサイクルメソッドを入力すると、この画像はAndroidライフサイクルメソッドの答えとして、検索オプションの上に表示されます(画像検索モードでも表示されません)。フローチャートの画像(画像)をクリックするのではなくStackOverflowリンクをたどらないと、気づかない(または見方によっては怠惰な)場合、簡単に誤解を招く可能性があります。
Andrew S

1
はい。これは私が探していたものです。誰かがこのようなもので本(またはドキュメント?)を書くべきです。onResumeなどは意味がありません。
Harsha_K 2018

22

ANDROID LIFE-CYCLE

Androidアプリケーションのライフサイクルを管理する方法は7つあります。


これらのすべての方法は何ですか?

これらのメソッドが呼び出される順序を知ることで、これらのメソッドが使用される理由を明確にするのに役立つ簡単なシナリオを考えてみましょう。

  • 電卓アプリを使用しているとします。アプリを起動するために、3つのメソッドが連続して呼び出されます。

onCreate() - - - > - - - >onStart() onResume()

  • 電卓アプリを使っていると、突然電話がかかってきます。電卓のアクティビティがバックグラウンドに移動し、別のアクティビティが言う。呼び出しの処理が前面に出て、2つのメソッドが続けて呼び出されます。

onPause() ---> onStop()

  • 電話での会話を終了すると、電卓のアクティビティがバックグラウンドからフォアグラウンドに移動するため、3つのメソッドが連続して呼び出されます。

onRestart() - - - > - - - >onStart() onResume()

  • 最後に、電卓アプリですべてのタスクを完了し、アプリを終了したいとします。さらに2つのメソッドが続けて呼び出されます。

onStop() ---> onDestroy()


アクティビティが存在する可能性のある4つの状態があります。

  • 開始状態
  • 実行状態
  • 一時停止状態
  • 停止状態

開始状態には以下が含まれます。

新しいLinuxプロセスを作成し、新しいメモリを新しいUIオブジェクトに割り当て、画面全体をセットアップします。したがって、ほとんどの作業はここで行われます。

実行状態には以下が含まれます。

現在画面上にあるのはアクティビティ(状態)です。この状態だけで、画面上での入力や、ボタンのタッチとクリックなどの処理を行います。

一時停止状態には以下が含まれます。

アクティビティがフォアグラウンドではなくバックグラウンドにある場合、そのアクティビティは一時停止状態と呼ばれます。

停止状態には以下が含まれます。

停止したアクティビティは、再起動することによってのみフォアグラウンドで購入でき、いつでも破棄できます。

アクティビティマネージャーは、新しいアクティビティが既存のアクティビティに追加されるシナリオでも、ユーザーエクスペリエンスとパフォーマンスが常に最高になるように、これらすべての状態を処理します


onPauseからonResumeの例はありますか?
zeeali 2017年

14

私はこの質問とその回答が好きですが、今のところ、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アクティビティライフサイクル


8

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が他の操作にメモリを必要とするときはいつでも、一時停止したアクティビティは停止し、停止したアクティビティは破棄されます。

私はそれが十分に明確であることを望みます。


フォーカスが失われ始めて最終的にユーザーに見えなくなるようになるアクティビティと、ユーザーにアクティビティが完全に見えなくなったときのOnstopメソッドの間の中間段階としてonPauseメソッドを呼ぶことができますか
Nav

そういうことになると思います。
Masiar

3
@Nav 3つのアクティビティがあり、AからBに移動すると、AのonPauseがBからCに呼び出され、onPause of BとonStopが呼び出されます。
MKJParekh 2011

3

高評価の回答の上にいくつかの情報を追加します(KILLABLEの追加セクションと次の一連のメソッドを追加しました。これらはライフサイクルで呼び出されます):

出典:developer.android.com

ここに画像の説明を入力してください

上記の表の「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()ライフサイクルメソッドとして引用されていなくても呼び出されることに注意してください。


0

上記の回答に従っていくつかのログを実行すると、出力は次のようになります。

開始アクティビティ

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は離れるすべてのインスタンスにあるようです(アプリを閉じる場合を除く)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.