我们都知道Activity的启动模式有四种:standard,singleTop,singleTask和singleInstance,书上也有介绍,主要是通过Activity栈和内存地址来分析的,不过我觉得从Activity的生命周期,以及Activity前台与后台的切换来理解也不错。
1.标准模式standard
该模式是默认的启动模式,即xml中不配置Activity的launchMode属性,那么就是标准的启动模式。那么标准模式下Activity的生命周期是什么样的呢,首次启动onCreate()->onStart()->onResume(),灭屏后onPause()->onStop(),亮屏onRestart()->onStart()->onResume(),按home键切到后台,onPause()->onStop()->onDestroy(),尽管从任务列表还可以看到该Activity,实际上它已经被销毁了,点击该Activity,生命周期是onCreate()->onStart()->OnResume(),等于又创建了一个新的Activity,所以使用标准模式,就需要考虑在应用被切到后台的时候,重写onSaveInstanceState()来保存数据,向bundle中写入数据,然后再读取。由此可见,标准模式是不支持后台运行的。如果是使用intent来启动该模式的Activity,那么不管当前任务栈中有没有该Activity的实例,都会创建一个新的Activity实例。
2.singleTop
这种模式的启动后生命周期同上,不过按下home键后,生命周期如下:onPause()->onStop(),从任务列表中再次启动该Activity,周期是onRestart()->onStart()->onResume,尽管该Activity不是位于任务列表的第一个。可见,该模式是可以支持后台运行的。如果是通过intent来启动Activity,那么如果之前创建的Activiy对象没有位于栈顶,那么就会重新创建对象,从任务列表启动Activity,可以理解为是否支持create_from_history。
3.singleTask
启动onCreate()->onStart()->onResume(),切换后台onPause()->onStop(),从任务列表启动onRestart()->onStart()->onResume()。从切换后台前台后的生命周期,以及Activity的数据来看,与singleTop没什么差异,都可以保存数据。不过通过intent来启动的Activity会根据当前活动栈中是否有该Activity实例,来决定是否重建Activity对象。
4.singleInstance
该模式下启动,灭屏,亮屏,后台,前台,所经历的生命周期与singleTop,singleTask一样,也可以保存之前的数据,支持后台。该模式与上述模式的差异,主要还是在任务栈,如果用intent启动这样的一个Activity,那么系统会创建一个新的任务栈,该任务栈中只存放该Activity的一个instance。