Activity起動モードでSingleTopはonNewIntent()を呼び出すだけでなく

2533 ワード

Activity起動モードがSingleTopに設定され、起動されたactivityがスタックの上部にある場合、activityのonNewIntent()メソッドだけでなく、onPause()およびonResume()メソッドも呼び出されます.
実際には、buttonが1つしか含まれていないactivityを作成し、buttonにクリックイベントを設定して本activityを起動します.
        Button button = (Button)findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass(MainActivity.this,MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                startActivity(intent);
            }
        });
では、上記の赤いコードのようなsingleTopの起動モードが設定されていることに注意してください.
次にactivityの各ライフサイクルメソッドを書き換えます.onCreate、onStart、onResume、onPause、onStop、onDestroy、onNewIntentメソッドを書き換えます.ライフサイクルメソッドでlogを印刷し、異なるメソッドを区別するために呼び出されます.onStartを例に挙げると、次のようになります.
    @Override
    protected void onStart() {
        super.onStart();
        Log.d("test","onStart " + this.toString());
    }
は、logにも現在のオブジェクトの説明が出力され、新しいオブジェクトであるかどうかを区別することに注意する.
その結果、本activityインタフェースでbuttonをクリックして本activityを起動しようとすると、log出力は以下のようになる.
04-27 09:07:29.884 1215-1215/com.example.administrator.test_delete D/test: onCreate com.example.test.MainActivity@13e66b62
04-27 09:07:29.917 1215-1215/com.example.administrator.test_delete D/test: onStart com.example.test.MainActivity@13e66b62
04-27 09:07:29.917 1215-1215/com.example.administrator.test_delete D/test: onResume com.example.test.MainActivity@13e66b62
04-27 09:07:46.373 1215-1215/com.example.administrator.test_delete D/test: onPause com.example.test.MainActivity@13e66b62
04-27 09:07:46.373 1215-1215/com.example.administrator.test_delete D/test: onNewIntent com.example.test.MainActivity@13e66b62
04-27 09:07:46.373 1215-1215/com.example.administrator.test_delete D/test: onResume com.example.test.MainActivity@13e66b62
のうち、最初の3つはアプリケーションのインストール後に初めて起動したlogであり、後の3つはbuttonをクリックした後に追加されたlogである.
起動モードがSingleTopに設定され、起動されたactivityがスタックの上部にある場合、このactivityを起動するとonPause()、onNewIntent()、onResume()が相次いで呼び出され、つまり、アプリケーションフロントのライフサイクルが再実行されることがわかります.SingleTopモードのほとんどの説明では、onPause()、onResume()メソッドを呼び出すとは言っていません.これは注意が必要です.