onStart()とonResume()の違い


176

onStart()遷移状態の意味がわかりません。onResume()この方法は、常に後に呼び出されますonStart()。なぜonResume()呼び出されonRestart()onCreate()メソッドが除外されonStart()ないのですか?その目的は何ですか?

なしでは生きられないのはなぜですかonStart()。私はまだそれを冗長だと考えています(おそらくその意味を完全に理解していないためです)。


アプリケーションのライフサイクルについては、こちらをご覧ください:d.android.com/guide/topics/fundamentals.html
ykatchou

これは簡単です。これでWITH Fragmentsを説明してみてください。これがya Androidプログラミングです。
Scott Biggs

以下の回答には、説明付きの実際のコードはありません。これはフラグメントでそれを説明するコードです。
Atul

回答:


306

onRestart()およびonCreate()メソッドの後にonStart()を除いてonResume()を呼び出すことができないのはなぜですか?その目的は何ですか?

はい、最初の回答はかなり長かったので、これ以上拡張しないので、試してみましょう...

public DriveToWorkActivity extends Activity
    implements onReachedGroceryStoreListener {
}

public GroceryStoreActivity extends Activity {}

注意してください:super.onCreate(...)などの呼び出しを意図的に省略しました。これは疑似コードなので、ここで芸術的なライセンスを取得してください。;)

DriveToWorkActivityフォローする方法...

protected void onCreate(...) {
    openGarageDoor();
    unlockCarAndGetIn();
    closeCarDoorAndPutOnSeatBelt();
    putKeyInIgnition();
}

protected void onStart() {
    startEngine();
    changeRadioStation();
    switchOnLightsIfNeeded();
    switchOnWipersIfNeeded();
}

protected void onResume() {
    applyFootbrake();
    releaseHandbrake();
    putCarInGear();
    drive();
}

protected void onPause() {
    putCarInNeutral();
    applyHandbrake();
}

protected void onStop() {
    switchEveryThingOff();
    turnOffEngine();
    removeSeatBeltAndGetOutOfCar();
    lockCar();
}

protected void onDestroy() {
    enterOfficeBuilding();
}

protected void onReachedGroceryStore(...) {
    Intent i = new Intent(ACTION_GET_GROCERIES, ...,  this, GroceryStoreActivity.class);
}

protected void onRestart() {
    unlockCarAndGetIn();
    closeDoorAndPutOnSeatBelt();
    putKeyInIgnition();
}

OK、それはまた別の長い(ごめん)しかし、これが私の説明です...

onResume()運転を始めるonPause()ときと一時停止するときです。それで私は運転して、赤いライトに到達するので、一時停止します...ライトが緑になり、再開します。別の赤いライトと私は一時停止し、それから緑になるので再開します。onPause() -> onResume() -> onPause() -> onResume()ループはタイト一つであり、私の旅を通じて何度も発生します。

ループが停止して再起動(私の旅を続けるための準備)から再開するまでは、おそらくあまり一般的ではありません。あるケースでは、私は食料品店を見つけ、それGroceryStoreActivityを開始しました(私DriveToWorkActivityをのポイントに強制しますonStop())。店から戻ったとき、私は通り抜けonRestart()onStart()そして再び旅を再開します。

私は、中のコード置くことonStart()の両方にonCreate()onRestart()して上書きする気にしないでonStart()ニーズの間行われることをより多くのすべてではなく、onCreate() -> onResume()そしてonRestart() -> onResume()、より多くの私は複製してる事を。

だから、もう一度引用し直すと...

onRestart()およびonCreate()メソッドの後にonStart()を除いてonResume()を呼び出すことができないのはなぜですか?

オーバーライドしない場合onStart()、これが効果的に起こります。のonStart()メソッドはActivity暗黙的に呼び出されますが、コード内の効果は事実上onCreate() -> onResume()またはonRestart() -> onResume()です。


これは、両方のことを意味onCreate()し、onRestart()一般的なコードの多くを共有することになり、右?
Dheeraj Vepakomma

1
@Dheeraj:必ずしもそうとは限りません。これは疑似コードであり、Activityライフサイクルの各段階がどのように使用されるかを説明するためだけのものです。onCreate(...)インスタンスメンバー(UI要素など)のインスタンス化に関しては、作成段階で多くのことを行うことができますが、「再起動」でこれを行う必要はありません。現実には、多くのActivities本当に以上実装する必要はありませんonCreate(...)onResume()そしてonPause()他の方法は、あなたが他の事をする必要がある場合がありますケースのために利用可能であり、鍵はどこのコードを入れて理解することです。
Squonk 2012

1
これが私がiOSやWP7に比べてAndroid APIを嫌うようになった理由です...私はC#で3つすべてで実行されるゲームを作成しており、GoogleとAndroidにかなりがっかりしていると言わざるを得ません。言語/ API設計部門では不足しているようです。他のLinux電話OSが引き継ぐことを期待しています。オープンソース全般に投票します...
zezba9000

2
@ティム:わかりました、もっと良いデザインを考えてください。誰かがアプリ(アプリ)を使用していて、突然電話がかかってきた場合の携帯電話のシナリオをどのように扱いますか?アプリデザイナーはActivityライフサイクルメソッドを明示的に呼び出しません。それを行うのはAndroid OSであり、それは非常に効率的に行われます(アプリ開発者が何をしているのかを知っており、効率的にコーディングしていると仮定します)。多くのAndroid開発を行うと、なぜ物事が彼らのように機能するのかがわかります。100%完璧ではありませんが、それはかなり良いことです。
Squonk 2013年

9
以下のニレシュの答えはもっと明確だと思います。主な違いonStartとは、onResume「可視性」と「ユーザーとの対話」のことです。この車の運転の比喩は混乱を招き、あまり役に立たない。
KJ

142

短い答え:

onStartがなければ、アクティビティはユーザーに「見える」状態になります。ただし、ユーザーはそれと「対話」できず、他の小さなダイアログと重複する可能性があります。ユーザーと対話するこの機能は、onStartとonResumeを区別するものです。ガラスのドアの後ろにいる人と考えてください。あなたはその人を見ることができますが、彼とやり取りする(話す/聞く/握手する)ことはできません。OnResumeは、ドアオープナーのようなものであり、その後対話を開始できます。

さらに、onRestart()は最も理解されていないものです。onRestart()の代わりにonStop()の後に直接onStart()またはonResume()に移動しない理由について質問できます。作成部分が省略されている場合、onRestart()がonCreate()と部分的に同等であることに注意すると、理解が容易になります。基本的に、両方の状態がonStart()につながります(つまり、アクティビティが表示されます)。したがって、両方の州が表示されるものを「準備」する必要があります。OnCreateには、表示されるものを「作成」する追加の責任があります。

したがって、それらのコード構造は次のようなものに適合します。

onCreate()
{
     createNecessaryObjects();

     prepareObjectsForDisplay();
}


onRestart()
{
     prepareObjectsForDisplay();

}

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アクティビティライフサイクル


4
生徒に説明するときは、onStop()ではなくmaybeOnInvisible()を使用します。そして、onDestroy()の代わりにmaybeOnDestroy()を使用してください。これらの名前は私が見つけた説明としてうまく機能します。Googleが実際にこれらの名前に変更してほしくないと思いました。
Stephan Branczyk 2013

あなたの提案の名前のように私は、彼らが作るのを助けるいくつかのばかげたAndroidのAPIのこの部分の感覚を。ライフサイクルに関して一般的な質問がまだあります。すべての図で、onPauseからonResumeへのパスがあることを示しています。どんな場合でも実際にそのパスがたどったのを見たことがありません。常にonStopからonStartへのパスをとります。他の経路をトリガーするものは何ですか?
Dewey Vozel

@StephanBranczykなぜあなたは多分...()を使うのですか?なぜ「たぶん」ですか?
MarianPaździoch15年

1
@Damnum、アクティビティのライフサイクルの最新の説明については、Googleが作成したAndroid Udacityの中間コースを確認することをお勧めします。青いボタンをクリックして無料で資料にアクセスでき、試用ボタン(またはナノ度ボタン)ではない場合は無料です。udacity.com/course/developing-android-apps--ud853
Stephan Branczyk

1
@Damnum、あなたが見たビデオに関連するudacityフォーラムでその質問をすることをお勧めします。しかし、基本的には、ダイアログアクティビティであろうと、ダイアログのみであろうと、使用されているダイアログに依存すると思います。
Stephan Branczyk 2016

29

onStart()アクティビティがユーザーに表示されるときに呼び出されます。 onResume()アクティビティがユーザーとの対話を開始するときに呼び出されます。この場合、別のことをしたいかもしれません。

参照してください。このリンクを参照するために。



10

「Hello、Android、Introducing Google's Mobile Development Platform」という本は、Androidアプリのライフサイクルをわかりやすく説明しています。幸いなことに、彼らは抜粋としてオンラインで特定の章を持っています。http://media.pragprog.com/titles/eband3/concepts.pdfの 39ページの図を参照して ください

ちなみにこの本はアンドロイド初心者にもオススメです!


2
素敵な画像と良い本ですが、それでもなぜonStart()メソッドが本当に必要なのか、そしてその中で私たちができる特別なことをonResume()で行うことができないという答えはありません。
ユージーン

8
アプリが一時停止されている場合、onStart()は呼び出されません。別のアプリがフォーカスを取得してもアプリを完全に不明瞭にしない場合、アプリは「一時停止」されます。したがって、「一時停止」状態では、「停止」状態とは異なる動作をする可能性があります。したがって、アプリが一時停止状態から「再開」される場合と、アプリが停止状態または完全開始から「開始」される場合とでは、異なる処理を実行できます。それは役に立ちますか?
Martin Booka Weser

7

特に派手な例は、を使用してアクティビティからマネージダイアログを表示することにした場合ですshowDialog()。ダイアログが開いたままの状態でユーザーが画面を回転させると(これを「構成の変更」と呼びます)、メインアクティビティはまでのすべての終了ライフサイクル呼び出しを通過し、onDestroy()再作成され、ライフサイクルを遡ります。ただし、予期しない可能性があるのは、onCreateDialog()との間ですonPrepareDialog()(実行時に呼び出され、showDialog()今度は自動的にダイアログを再作成するためのメソッド-管理されたダイアログであるため自動的に)との onStart()で呼び出さonResume()ます。ここでのポイントは、ダイアログが全画面をカバーしないため、メインアクティビティの一部が表示されたままになることです。詳細ですが重要です!


7

onStart()

  1. onCreate(バンドル)またはonRestart後(後に呼ばれる)が続く )(onResume
  2. BroadcastReceiverを登録してonStart()、UIに影響を与える変更を監視できます。onStop()で登録を解除する必要があります。
  3. 派生クラスは、このメソッドのスーパークラスの実装を呼び出す必要があります。そうでない場合は、例外がスローされます。

onResume()

  1. onRestoreInstanceState(Bundle)、onRestart()、またはonPause()の後に呼び出されます
  2. アニメーションを開始し、排他的アクセスデバイス(カメラなど)を開く

onStart() 通常は、戻り値が次のようなバックグラウンドスレッドに作業をディスパッチします。

  • START_STICKY:強制終了した場合に自動的に再起動し、アクティブな状態を維持します。

  • START_REDELIVER_INTENT 自動再起動のため、stopSelf()の前にサービスが強制終了された場合は再試行します。

onResume()デバイスがスリープ状態になった後、またはアラートまたはその他の部分画面の子アクティビティが前のウィンドウの一部を表示したままにした後、メソッドがフィールドを再初期化する必要がある(例外のキャッチ付きのtry構造内で)OSによって呼び出されます)。このような状況ではonStop()、子が閉じても呼び出されません。

onResume()onStart()アクティビティがバックグラウンドから再開されるときに呼び出されません

詳細については、Android_activity_lifecycle_gotchaおよびActivity Lifecycleをご覧ください。


実際にアプリがバックグラウンドになると止まる
デッドフィッシュ

5

うまくいけば、簡単な説明:-

onStart() ->アクティビティが表示されたときに呼び出されますが、フォアグラウンドにない可能性があります(たとえば、AlertFragmentが一番上にあるか、他の考えられる使用例です)。

onResume() ->アクティビティがフォアグラウンドにある場合、またはユーザーがアクティビティと対話できる場合に呼び出されます。


4

onStart()手段は、Activity目に見える状態に入り、レイアウトが作成されますが、ない相互作用、この活動のレイアウトを持つことができます。

Resume() これで、アクティビティレイアウトを操作できるようになります。


1

onStart()とonResume()の呼び出しの間に発生することがあることに注意してください。つまり、私が痛々しく見つけたonNewIntent()です。

SINGLE_TOPフラグを使用していて、インテントエクストラを使用して一部のデータをアクティビティに送信する場合 onStart()のとonResume()の前に呼び出されるonNewIntent()でのみアクセスできます。そのため、通常は、エクストラから新しい(たぶん変更されただけの)データを取得してクラスメンバーに設定するか、setIntent()を使用して新しいインテントを元のアクティビティインテントとして設定し、onResume()でデータを処理します。


0

http://developer.android.com/training/basics/activity-lifecycle/starting.htmlへの参照

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

onPause()システムが別のアクティビティを再開しようとしているときに呼び出されます。このメソッドは通常、保存されていない変更を永続データにコミットしたり、アニメーションを停止したり、CPUを消費している可能性があるものを停止したりするために使用されます。次のアクティビティは復帰するまで再開されないため、非常に迅速に何でも実行する必要があります。onResume()アクティビティが前面に戻ったonStop()場合、またはユーザーから見えなくなる場合に続きます。


0

これが答えとしてカウントされるかどうかはわかりませんが、違いを説明するGoogleのコース(Kotlinを使用したAndroidアプリの開発)からのYouTubeビデオはこちらです。

  • On Startは、アクティビティが表示されたときに呼び出されます
  • On Pauseは、アクティビティがフォーカスを失ったときに呼び出されます(ダイアログがポップアップするなど)。
  • On Resumeは、アクティビティがフォーカスを取得したときに呼び出されます(ダイアログが消えたときなど)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.