web-dev-qa-db-ja.com

Android Activities)のonPause()とonStop()()の違いは何ですか?

Android doc here http://developer.Android.com/reference/Android/app/Activity.html から、「アクティビティがフォアグラウンドになります」と呼びますonPause()、および 'Activity is not visible'はonStop()を呼び出します。

「アクティビティが前面に表示される」と「アクティビティが表示されなくなる」と同じではないですか?それらの違いは何ですか?

137
michael

いいえ、あるアクティビティがフォアグラウンドになったとしても、それは必ずしも他のアクティビティが完全に見えないことを意味するわけではありません。以下の場合を考えてください:

Activity with the theme Theme.Dialog

ここでは、両方のアクティビティが同時に表示されます。フィールドを持つ最初のアクティビティは別のアクティビティによって隠されており、ユーザーはそれと対話できなくなります。ただし、結果はすべて表示されたままです。

それは、どのアクティビティが完全に不透明であり、画面全体をカバーしており、どのアクティビティがそうではないかという疑問を残しています。この決定は、アクティビティを含むウィンドウに基づいています。ウィンドウにフラグwindowIsFloatingまたはwindowIsTranslucentがある場合、アクティビティは基になるものを非表示にしないと見なされます。そうでない場合、onStop()を表示し、呼ばれる。関連コードはcom.Android.server.am.ActivityRecordにあります:

fullscreen = ent != null && !ent.array.getBoolean(
        com.Android.internal.R.styleable.Window_windowIsFloating, false)
        && !ent.array.getBoolean(
        com.Android.internal.R.styleable.Window_windowIsTranslucent, false);
101
Malcolm

それでもその一部を見ることができる場合(Activityが前面に来ると、画面全体を占有しないか、やや透明になります)、onPause()が呼び出されます。その一部が表示されない場合、onStop()が呼び出されます。

たとえば、ダイアログ**は以前のActivity全体をカバーしていない場合があり、これはonPause()が呼び出される時間になります。

**ここではAndroidダイアログではなく、ポップアップし、ユーザー画面の一部のみを隠すものの概念的なアイデアです。このコメントは、 @GMsoF以下

33

フォアグラウンドにいるということは、アクティビティに入力フォーカスがあることを意味します。たとえば、アクティビティは表示できますが、フォーカスのあるダイアログによって部分的に隠されます。その場合、onPause()は呼び出されますが、onStop()は呼び出されません。ダイアログが消えると、アクティビティのonResume()メソッドが呼び出されます(ただし、onStart()は呼び出されません)。

10
Ted Hopp

実用的「onPause()」の違い「onPause()+ onStop()」の違い。

新しいアクティビティが発生し、画面の一部のスペースを占有するたび。そのため、以前に実行したアクティビティはある程度まで表示されます。この場合、以前に実行したアクティビティはバックスタックにプッシュされません。 つまり、ここではonPause()メソッドのみが呼び出されます

一方、新しいアクティビティが発生してフルスクリーンを占有し、以前に実行していたアクティビティが消えた場合。この場合、以前に実行したアクティビティはバックスタックに移動されます。 ここでは、onPause()+ onStop()が呼び出されます。

概要へ

onPause()-画面は、他の新しいアクティビティによって部分的に覆われています。アクティビティはバックスタックに移動されません。

onPause()+ onStop()-画面は他の新しいアクティビティで完全に覆われています。アクティビティはバックスタックに移動します。

もっと詳しく知る- バックスタック

2
Yash

OnPauseメソッドとonStopメソッドで多くの問題に直面したため、出会った3つのシナリオをクリアします。
1。最近のアプリボタンをクリックすると、ライフサイクルメソッドは呼び出されませんが、onWindowFocusChanged(boolean hasFocus)が呼び出されますhasFocus値はfalseとして渡されます。 Android 5より前のバージョン、最近のアプリボタンを押したときに呼び出されるonPauseメソッド。

2。Malcolm で述べたように、アクティビティのようなポップアップがアクティビティの上に表示されると、onPauseボタンが呼び出されます。画面全体を占める新しいアクティビティが呼び出されると、onStopが前のアクティビティで呼び出されます。 Android 許可ダイアログ また、アクティビティがonPauseを呼び出すようにします。

3。アクティビティで画面がタイムアウトした場合、onPauseが呼び出されます。しばらくして画面を開かない場合は、onStopが呼び出されます。

ateiob で言及されている重要なことの1つは、答えを完成させることです。

一時停止されたアクティビティは完全に生きています(すべての状態とメンバー情報を維持し、ウィンドウマネージャーに接続されたままです)。停止されたアクティビティもすべての状態とメンバー情報を保持しますが、ウィンドウマネージャーに添付されなくなります


それが役に立てば幸い。

0
royatirek

新しいアクティビティが開始されるたびに、前のアクティビティのonPauseがどんな状況でも反抗的に呼び出されます。

実際には2つの状況があります。

1-前のアクティビティの一部が表示されるか、新しいアクティビティが透過的になります。onPauseのみが呼び出されます。

2-前のアクティビティは新しいアクティビティで完全にカバーされます:onPauseonStopの両方が呼び出されます

----いくつかのメモを述べるのに適しています:

注1:アクティビティの上でダイアログが開始された場合、onPauseまたはonStopのいずれも呼び出されません。

注2:テーマがダイアログに設定されているアクティビティの場合、動作は通常のアクティビティのようになります。

注3:明らかにマシュマロはonPauseを引き起こすので、許可ダイアログのようなシステムダイアログ。

0
Amir Ziarati

簡潔に言うと:

別のアクティビティが表示されると、前のアクティビティライフサイクルメソッドのonStop()が呼び出されます。アクティビティの上部にダイアログがある場合、onPause()が呼び出されます。

:アクティビティは、画面全体に表示されるコンポーネントです。

:ダイアログは完全に画面いっぱいに表示されないため、アクティビティではありません。

0
Uddhav Gautam