android Activity生命周期:
1.andrid 完整的生命周期:onCreate() -> onStart()->onResume()->onPause()->onStop()->onDestory().
2.启动Activity:onCreate()->onStart()->onResume(),Activity进入可运行的状态。
3.Activity退居后台并且内存不足,系统会杀掉这个Activity(但是Activity还在任务栈但是这个时候的引用指向的对象为NULL)Actvity会重新走onCreate()->onStart()->onResume()。
4.Activiyt退居后台:例如开启了新的Activity或者是按下home键onPause()->onStop().
5.返回前台:onRestart()->onStart()->onResume()
6.锁屏:onPause()->onStop()
7.解锁:onStart()->onResume()
Activity启动的四种模式:
任务栈:栈先进后出的数据结构,任务栈也是。位于栈顶的Activity我们称该Activity处在焦点,当按下back键的时候Activity会挨个出栈。并且调用onDestory()。如果栈内没有Activity。该任务栈会被系统回收。每个app只有一个任务栈是以包名进行命名。
standard:标准启动模式每次启动Activity都会创建一个新的实例,并且将Activity压入栈,不管Activity是否存在,每次启动都会调用三个方法:onCreate()->onStart()->onResume()。
singleTop:栈顶复用模式,如果启动的Activity在栈顶,将不会重新创建实例也不调用启动三方法,同时Activity会调用onNewIntent(),如果Activity不存在于栈顶则启动方式和standard一模一样。
singleTask:栈内复用模式,创建这样的Activity系统会先确认Activity所需的任务栈是否存在如果不存在先创建Activity所需的任务栈,放入Activity。如果存在任务栈,系统会确认在任务栈中是否存在该Activity如果存在将Activity掉到栈顶,并且调用onNewIntent。并且singleTask会清理当前Activity之上的所有Activity。
singInstance:Activity会存在于单独的任务栈中,由于栈内复用的特性,后续的请求都不会创建新的Activity,除非这个特殊的任务栈被系统销毁了。
Activity快速恢复:
如果Activity启动后被系统kill,Activity这时候执行的不是onRestart()是onCreate(),Activity中的临时数据可能就丢失了,可以调用onSaveInstacneState()用来保存数据,这个方法一定会Activity在被回收前调用,就可以在onCreate()中恢复数据。当某个Activity即将被销毁的时候会调用onSaveInstanceState()除非是用户自己主动销毁比如按下back以下几种情况onSaveInStanceState()一定会被调用:
1.当用户按下home键
2.当用户按下home键之后启动其他的Activity
3.锁屏的时候
4.屏幕横竖屏切换的时候(如果不指定configchange属性)
onSaveInStanceState()被调用的原则就是非用户主动销毁Activity时候Activity有被销毁的危险时,系统会自动调用提供一个机会给你保存数据。
至于onRestoreInStanceState()被调用的前提是Activity确实被销毁了才会调用。onSaveInStanceState(),onRestoreInStanceState()不是成对调用的。如果确认Activity被系统销毁了异常关闭,也就是调用了onSaveInstanceState(),下次启动调用顺序:onCreate()->onStart()->onRestoreInStanceState()->onResume()
注:如果不是跟UI界面有关的参数或者变量,或者从影响你程序的行为你需要保存如没必要就不需要自己去写保存让它自己实现就好了。可以通过复写onSaveInStanceState(Bundle outState) 保存数据,在onCreate()中恢复。因为 Bundle参数可以传递到onCreate(Bundle saveInstanceState)中。onSaveInstanceState()方法一定会在onStop()之前调用但不一定在onPause()之后或之后调用。
两个Activity之间的转:
A Activity跳转到B Activity 他们之间经历的过程A的onPause()->onStop()然后B调用onCreate()->onStart()->onResume()。如果B是一个透明窗体或者是对话框那A不会调用onStop方法。
横竖屏切换:
与清单文件中的配置有关系
1.如果不设定Activity的android:congfigchange属性时横竖屏的切换activity每一次都是重新加载。
2.如果设定了androd:configchange="orientation|keyboardHidden|screenSize"属性只会执行onconfigurationchanged()。
如何将Activity设置成窗口样式:
android:theme="@android:style/Theme.Dialog"
如何退出多个Activity的app:
1.记录Activity退出时递归关闭就好。
2.在需要结束的时候发送给特定的广播,接收广播后Activity调用onDestory关闭。
3.