一、 Activity生命周期的重要性
1.Activity栈:先进后出规则。每一个应用程序(入口一般会是一个Activity 的onCreate 方法),都会产生一个进程(Process)。当系统内存即将不足的时候,会依照优先级自动进行进程(process)的回收。不管是使用者或开发者, 都无法确定的应用程序何时会被回收。所以为了很好的防止数据丢失和其他问题,了解生命周期很重要。
二、Activity整个生命周期的4种状态、7个重要方法和3个嵌套循环:
1.活动(Active/Running)状态:当Activity运行在屏幕前台(处于当前任务活动栈的最上面),此时它获取了焦点能响应用户的操作,属于运行状态,同一个时刻只会有一个Activity 处于活动(Active)或运行。
2.暂停(Paused)状态:当Activity失去焦点但仍对用户可见(如在它之上有另一个透明的Activity或Toast、AlertDialog等弹出窗口时)它处于暂停状态。暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但是当系统内存极小时可以被系统杀掉。
3.非活动(Dead)状态:Activity 尚未被启动、已经被手动终止,或已经被系统回收时处于非活动的状态,要手动终止Activity,可以在程序中调用"finish"方法。
4.7个重要的方法就不说了
5. 3个嵌套循环:1).Activity完整的生命周期:从第一次调用onCreate()开始直到调用onDestroy()结束;2).Activity的可视生命周期:从调用onStart()到相应的调用onStop()在这两个方法之间,可以保持显示Activity所需要的资源。如在onStart()中注册一个广播接收者监听影响你的UI的改变,在onStop() 中注销。3).Activity的前台生命周期:从调用onResume()到相应的调用onPause()。
三、Dalvak 虚拟机会根据其内存回收规则来回收内存:(顺序如下)
1. 先回收与其他Activity 或Service/Intent Receiver 无关的进程(即优先回收独立的Activity)因此建议,我们的一些(耗时)后台操作,最好是作成Service的形式
2.不可见(处于Stopped状态的)Activity;
3.Service进程(除非真的没有内存可用时会被销毁);
4.非活动的可见的(Paused状态的)Activity;
5.当前正在运行(Active/Running状态的)Activity。
四、横竖屏切换生命周期以及一些特殊情况声明周期
例2:横竖屏切换时候Activity的生命周期,他切换时具体的生命周期是怎么样的:
1、新建一个Activity,并把各个生命周期打印出来。运行Activity,得到如下信息:
onCreate-->onStart-->onResume-->
2、按crtl+f12切换成横屏时。onSaveInstanceState-->onPause-->onStop-->onDestroy-->
onCreate-->onStart-->onRestoreInstanceState-->onResume-->
3、再按crtl+f12切换成竖屏时,发现打印了两次相同的log。
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
4、修改AndroidManifest.xml,把该Activity添加android:configChanges="orientation",执行步骤3。onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
5、再执行步骤4,发现不会再打印相同信息,但多打印了一行onConfigChanged
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->onConfigurationChanged-->
6、把步骤5的android:configChanges="orientation" 改成 android:configChanges="orientation|keyboardHidden",执行步骤3,就只打印onConfigChanged,onConfigurationChanged-->
7、执行步骤4,打印onConfigurationChanged-->onConfigurationChanged-->
总结:
1)、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2)、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3)、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
4)、补充一点,当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变
5)、Activity运行时按下HOME键(跟被完全覆盖是一样的):onSaveInstanceState --> onPause --> onStop,再次进入激活状态时: onRestart -->onStart--->onResume
五、 Activity四种启动方式和栈原理
1. standard:模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。
2. singleTop:如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
3. singleTask:如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
4. singleInstance:在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。
备注: 后续有深入的理解,一定继续补充.....