许多系统设置可以在运行时改变(RunTime),比如语言,屏幕方向,键盘是否可用。当这些变化发生时,系统默认行为是重新加载正在运行的Activity,执行onDestroy(),然后再执行onCreate(),这样做的目的是让程序使用和新设置匹配的资源。
当runtime change发生,比如横竖屏切换,系统流程是这样的:
onSaveInstanceState() -> onDestroy() -> onCreate() -> onRestoreInstanceState()
横竖屏切换后的Activity的onCreate(Bundle savedInstanceState),参数savedInstanceState不为空,其他方式比如被其他context startActivity()得到的Activity其savedInstanceState为null。
如果退出Activity,不会执行onSaveInstanceState().当Activity被正常打开时,也不会执行onRestoreInstanceState()。
如果在配置文件中给Activity设置过android:configChanges,则当对应设置变化时系统会调用Activity中的方法onConfigChanged(),而不会再onDestroy() -> onCreate();否则不调用,而restart该Activity。
设备设置变化,对程序的影响是要保存用户的状态和匹配当前的设置。Google文档介绍了2种方式,对照上面介绍的,一种是让程序重新启动,但将状态数据封装到Bundle传给Activity,另外一种是程序自己处理,不走系统默认的重新启动的方式,回调onConfigChanged(),在该方法内自己处理。
针对上面的方式1,Google文档介绍说此种方式只适合传递“轻量”的数据,如果是传递像Bitmap等大的数据,会造成系统重启Activity变得很慢,如果确实要传递非轻量数据,官方建议使用Fragment。并且给出了伪代码例子,有时间了要写个demo验证下。启动应用,然后切到后台,被系统杀死进程后,如果保持用户状态,再次进入显示退出时的状态。
方式2的使用场景是要不需要切换资源或者是出于性能考虑,官方不建议使用该方式,是避免Activity重启最后的选择。。