重启app使用FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TOP的区别

重启app可以使用getLaunchIntentForPackage方法:

String pakageName = getPackageName(context);
        PackageManager packageManager = context.getPackageManager();
        Intent intent = packageManager.getLaunchIntentForPackage(pakageName);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        context.startActivity(intent);

这段代码很容易就能在网上搜到。令我很不解为什么要给intent设置flag:Intent.FLAG_ACTIVITY_CLEAR_TOP(有的会是Intent.FLAG_ACTIVITY_NEW_TASK)。为了解开疑惑,我测试了一下:
现在有三个activity:
mainActivity, MidActivity,SecondActivity。
其中mainActivity有个按钮跳到MidActivity,MidActivity有个按钮可以跳转SecondActivity,SecondActivity有5个按钮,第一个按钮执行:

Process.killProcess(Process.myPid());

第二个按钮重启app,使用Intent.FLAG_ACTIVITY_CLEAR_TOP。
第三个按钮重启app,使用Intent.FLAG_ACTIVITY_NEW_TASK。
第四个按钮跳到MidActivity。
第五个按钮跳到mainActivity。


执行下面的跳转
mainActivity ->MidActivity ->SecondActivity。在SecondActivity分别执行前三个键:
第一次,执行第一个按钮killProcess,app重启后自动进入MidActivity。点击返回,可以到mainActivity。在mainActivity发现进程发现变化。
第二次,执行第二个按钮,app重启后自动进入mainActivity。进程没变化,点击返回,app退出到后台。
第三次,执行第三个按钮,app重启后自动进入mainActivity。进程没变化,点击返回到SecondActivity,继续返回,到MidActivity ,再 到mainActivity,最后退出到后台。

从上面三种情况,首先Process.killProcess虽然把进程杀死了,但是app还是会再次启动并还原到上一个activity。忽略重启动作,Process.killProcess可以等同认为返回到上一个acitivity。

再次,使用getLaunchIntentForPackage重启app,并不会杀死进程。
重启app等同于从当前activity跳到mainActivity。

FLAG_ACTIVITY_CLEAR_TOP正如它本身定义的作用一样。SecondActivity跳到mainActivity后,mainActivity之上的activity都会被清除,所以在mainActivity点击返回就退出app了。这里执行如下跳转:
mainActivity ->MidActivity ->SecondActivity->mainActivity ->MidActivity ->SecondActivity
再执行第二个按钮,app重启后,进入mainActivity,这时候返回键会到SecondActivity,继续返回,到MidActivity ,再 到mainActivity,最后退出到后台。

FLAG_ACTIVITY_NEW_TASK,这里没有太大作用,因为都是同一个应用,并没有重新创建task。重启app的mainAtivity,放在栈顶。然后返回的顺序就很好理解了。


杀死进程重启app

没有杀死进程的重启,并没有销毁jvm,所以静态数据就没有被销毁。如果想完全重启(类似关闭app再启动app),就需要另外一种方法(这里不推荐Process.killProcess,很多文章中讨论了这个bug):

Intent intent = getBaseContext().getPackageManager()
                .getLaunchIntentForPackage(getBaseContext().getPackageName());
        PendingIntent restartIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT);
        AlarmManager mgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent); // 1秒钟后重启应用
        System.exit(0);

这里还是用getLaunchIntentForPackage进行重启,不同就是延迟了重启的操作。在重启之前先把程序给杀掉:

System.exit(0)

猜你喜欢

转载自blog.csdn.net/weixin_38801333/article/details/76846311