1. ホーム
  2. android

[解決済み] Androidです。どのような状況でダイアログが表示されるとonPause()が呼び出されるのでしょうか?

2023-07-31 14:10:35

質問

Androidのスニペット 活動内容 ドキュメント("までスクロールしてください。 前景寿命 "行)によると:

アクティビティは頻繁にフォアグラウンドに移行したり、フォアグラウンドから外れたりします。 例えば onPause() はデバイスがスリープしたときに呼び出されます または ダイアログが表示されたとき .

これがよくわからないのです。どのような状況でこのようなことが起こるのでしょうか?それは onPause() は、問題のダイアログのコンテキストが、ダイアログが表示されるアクティビティと異なる場合にのみ呼び出されるのですか?

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

上記のドキュメントからの引用によると、私のアクティビティの onPause() メソッドが呼び出されるのでしょうか? AlertDialog (または単に Dialog が表示されるのでしょうか?ダイアログが表示されたときに "onPause called" のログエントリが表示されるのでしょうか?

しかし、そのようなことは起こりません。もし私が 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");
    }
}

どのように解決するのですか?

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

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