81

Androidアクティビティドキュメントのスニペット(「フォアグラウンドライフタイム」の行までスクロールダウン)には、次のように記載されています。

アクティビティは、フォアグラウンドに頻繁に出入りする可能性があります。たとえば、onPause()デバイスがスリープ状態になったとき、またはダイアログが表示されたときに呼び出されます。

私はこれをよく理解していません。これはどのような状況で発生する必要がありますか?onPause()問題のダイアログのコンテキストが、ダイアログが表示されるアクティビティと異なる場合にのみ呼び出されますか?

編集:私の疑問を詳細に説明するためのコードサンプルを追加する

上記のドキュメントからの引用によると、次のコードの(または単に)が表示されonPause()たときに、アクティビティのメソッドを呼び出す必要がありますか?ダイアログが表示されたときに「onPausecalled」ログエントリを表示する必要がありますか?AlertDialogDialog

しかし、私はそれが起こるのを見ていません。また、Androidのライフサイクルを正しく理解していれば、そうすべきではありません。それで、その時の文書は何を指しているのでしょうか?

public class LifeCycleTestActivity extends Activity {

    private static final String TAG = "LifeCycleTest";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btn = (Button) findViewById(R.id.button1);

        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick");

                AlertDialog dialog = new AlertDialog.Builder(LifeCycleTestActivity.this).create();
                 dialog.setMessage("You Clicked on the button");
                 dialog.setTitle("Dialog!");
                 dialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
                 dialog.setCancelable(true);
                 dialog.show();


                /*
                Dialog dialog = new Dialog(LifeCycleTestActivity.this);
                 dialog.setTitle("Dialog!");
                 dialog.setCancelable(true);
                 dialog.show();
                */
            }
        });        
    }

    @Override
    protected void onPause() {
        Log.d(TAG, "onPause() called");
        super.onPause();

    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume() called");
    }
}
4

7 に答える 7

193

onPause()アクティビティがアクティビティスタックの最上位でなくなったときに呼び出されます。ダイアログ自体はアクティビティではないため、スタックの最上位にある現在のアクティビティが置き換えられることはないため、何も一時停止することはありません。

ただし、ダイアログ(小文字)は、Dialogクラスで実装する必要はありません。たとえば、テーマがダイアログのテーマに設定されているアクティビティを使用して実装することは珍しくありません。この場合、dialog-as-an-Activityを表示すると、新しいアクティビティがスタックの一番上に表示され、以前にあったものが一時停止します。

于 2011-09-12T07:52:23.970 に答える
13

私はAlertDialogあなたが言及したものを含め、ダイアログでかなり多くのコードを実行してきました。またonPause()、ダイアログがポップアップしたときにアクティビティで呼び出されているかどうかを確認しようとしましたが、これまでのところアクティビティは単に実行を継続し、それonPause() は呼び出されません

それが役立つかどうかはわかりませんが、少なくともあなたはあなたが経験していることを経験している他の人がいることを知っています:-)

于 2011-09-08T09:43:33.523 に答える
2

アクティビティがonPauseフェーズのアクティビティスタックの最上位に残っていないのは間違いです。

アクティビティをonPause状態に調整します-

  • アクティビティが部分的に表示されます(アクティビティに関するダイアログなど)。

  • Activityオブジェクトはメモリに保持され、すべての状態とメンバー情報を維持し、ウィンドウマネージャーに接続されたままになります。

    たとえば、ホームボタンを押すと、アクティビティがonPause()に入ります。まだスタックの一番上にあります。

図1では、Activity3は破棄され、トップスタックから削除されます

図2では、タスクAはバックグラウンドに移動しますが、アクティビティXはまだスタックの一番上にあります。onPause()メソッドをオーバーライドすると、この状態になります

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

図1.タスク内の新しい各アクティビティがバックスタックにアイテムを追加する方法の表現。ユーザーが[戻る]ボタンを押すと、現在のアクティビティが破棄され、前のアクティビティが再開されます。

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

図2.2つのタスク:タスクBはフォアグラウンドでユーザーの操作を受け取り、タスクAはバックグラウンドで再開されるのを待っています。

于 2014-06-07T02:34:43.560 に答える
0

以前のバージョンのAndroidライフサイクルで、アクティビティが表示されていないときにonPauseが呼び出されたことを読んだことを覚えていると思います。つまり、アクティビティの一部がポップアップの下にまだ表示されている場合、onPauseは呼び出されません。

たぶん、他の何人かの専門家がこの振る舞いを保証することができますか?

于 2011-09-06T22:10:09.610 に答える
0

私の少し奇妙な経験onResumeでは、呼び出されますdialog.setCanceledOnTouchOutside(true);が、onPause呼び出されることはありません。

そうは言っても、ドキュメントはシステムダイアログに焦点を当てているかもしれないと思います(例えば、バッテリーが少ない)。

于 2012-02-28T09:54:47.847 に答える
0

@hackbot

onPause()は、アクティビティがアクティビティスタックの最上位になくなったときに呼び出されます。ダイアログ自体はアクティビティではないため、スタックの最上位にある現在の>アクティビティは置き換えられないため、何も一時停止しません。

すべては実装に依存します...

ダイアログとは何ですか?WindowManager///によって表示に追加されたウィンドウであるため、表示されたときのウィンドウはすべての上にあります....(Zオーダー)

アクティビティとは...ウィンドウを作成する「もの」です...。

ダイアログが表示されるか、そのウィンドウが既存のアクティビティの上に表示されると、アクティビティウィンドウの一部が上書きされるため、既存のアクティビティは部分的に非表示の状態に移行し、ActivityThreadからonPause()が呼び出されます

しかし、確かにここでも1つの考えを考慮する必要があります...

ウィンドウの状態は、が上に表示されているスタンドアロンウィンドウであるか、子ウィンドウであり、その親がアクティビティウィンドウである場合です。..。

だから私たちが知っているとき

  • 追加に使用するWindow.LayoutParams(FLAGS)
  • ウィンドウに表示するために使用されるIBinder

ウィンドウが互いに重なり合って表示されたときにアクティビティがどのように動作するかを理解します。各ウィンドウにはコールバックがあるため、アクティビティまたはダイアログで状態を管理するために使用されます。

関連するコンポーネント:

  • android.os.IBinder

  • android.view.Window

  • android.view.Window.Callback

  • android.view.WindowManager

  • android.view.WindowManager.LayoutParams

  • android.view.Display

ところで:

画面上のウィンドウを知りたい場合[所有するプロセスにのみ適用可能-ウィンドウはプロセスに属し、サンドボックス化されているため-各プロセスは厳密に「ART」と表示される個別のJVMです]反射を使用できます。

  • android.view.WindowManagerImpl
  • android.view.WindowManagerGlobal
于 2018-07-05T20:29:58.037 に答える
-4

onPause()アクティビティがバックグラウンドになるたび、Dialogまたはその他Activityがフォアグラウンドになるたびに呼び出されます。これは、ユーザーが対話しているものを最優先するために行われます。例:アプリケーションのホーム画面(これはアクティビティです)にいるとすると、ホーム画面はにあると言われますforeground。ボタンを押して次の画面に移動するか、ダイアログが表示されると、次の画面が表示されscreen/Activity/DialogforeGroundhomecreenがbackGroundに移動します。これは、 homeScreenの onPause()メソッドが呼び出されたことを意味します。

于 2011-09-06T10:45:04.133 に答える