Activity启动模式中SingleTop,不仅仅会调用onNewIntent()

当设置activity启动模式为SingleTop,且被启动的activity已经在栈顶时,此时不仅仅会调用该activity的onNewIntent()方法,还会调用onPause()onResume()方法。

亲身实践如下:编写一个只含一个button的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
其中,前三条为应用安装后第一次启动的log,后三条为点击button后新增的log。 可见当启动模式设置为SingleTop,被启动的activity在栈顶时,启动该activity会先后调用onPause() 、onNewIntent()、onResume(),也就是说,会重新走一遍应用前台的生命周期。而大多数对SingleTop模式的介绍中,都没有说到会调用onPause() 、onResume()方法。这是需要注意的。



你可能感兴趣的:(Activity启动模式中SingleTop,不仅仅会调用onNewIntent())