本系列博客主要学习:
为什么要学习Activity,
Activity的生命周期,
Activity的工作模式,
Activity的调用栈管理。
Activity是四大组件中使用频率最高的组件,是与用户交互的第一接口,了解Activity的生命周期,工作模式,和调用栈管理方式是学习并了解Android的基础。
不出意外的话,Activity会经历以下的生命周期:
(1)onCreate():此方法是生命周期中的第一个方法,它表示Activity正在被创建,在这个方法中我们可做些初始化工作,如通过setContentView来加载界面布局资源。初始化些数据。
(2)onStart():它表示Activity正在被启动,但还没有出现在前台,无法和用户交互。这个时候Activity已经可见了,但是我们看不见。
(3)onResume():它表示Activity已经可见,出现在前台可以和用户进行交互了。
(4)onRestart():它表示Activity正在被重新启动,正常情况下,当当前的Activity从不可见的状态变为可见的状态时,此方法就会被调用。
(5)onPause():它表示Activity正在停止,一般情况下,会紧接者执行onStop(),若是当启动的activity是透明的则不会掉用onStop()。
(6)onStop():它表示Activity即将停止。
(7)onDestroy():它表示Activity即将被销毁,这是Activity生命周期中的最后一个方法,在这里我们一般做些资源的回收,释放工作。
注意:1:onStart()和onResume()都表示activity可见了,前者在后台(我们看不见,不可交互)后者在前台(我们可见,可交互).
2:在onPause()不能做些太耗时的操作,因为若是太耗时则会影响新Activity的显示,onPause必须先执行完,新 Activity的onResume()才会执行。
当Activity Act1第一次启动时,会回调如下:onCreate()-->onStart()-->onResume()。当用户打开一个新的Activity Act2或者切换到桌面等其他界面(不是按back键后显示出的界面)时,Act1回调如下方法onPause()-->onStop(),但是当新启动的Act2采用的是通明主题则当前的Act1不会回调onStop方法。当用户再次回到Act1时,Act1回调onRestart()-->onStart()-->onResume(),但当用户从透明界面回到Act1时Act1回调onResume方法。当用户在Act1界面按back键时Act1回调:onPause()-->onStop()-->onDestroy().
注意:1:当Activity被系统回收后再次打开则和Act第一次启动时的情况一样。
2:我们认为onCreate()和onDestroy()配对,创建和销毁。onStart()和onStop(),可见和不可见。onResume()和onPause(),前台和后台。
3:Act1启动Act2时回调的方法先后,Act1:onPause() --> Act2:onCreate() --> Act2:onStart() --> Act2:onResume() --> Act1:onStop().
如当Activity处于竖屏状态,当旋转屏幕,由于资源系统配置发生改变,Activity就会被销毁并且重新创建,当然Android的设计者想的很全面,我们可以阻止系统重新创建我们的Activity。
在默认情况下,我们的Activity在不做特殊处理的情况下,当系统配置发生改变后,Activity会被销毁并重建,它会回调onPause(),onStop(),onDestroy()等方法,由于Activity是在异常情况下终止并且有机会重新显示的,系统会回调onSaveInstanceState()来保存当前Activity的状态(onSaveInstanceState方法调用的时间在onStop方法之前,它有可能在onPause方法之前,也可能在onPause方法之后。当我们按back键时onSaveInstanceState方法它是不会被调用的。)。在这种异常的情况下,当Activity被重新创建后,系统会调用onRestoreInstanceState方法,并且把先前销毁时调用的onSaveInstanceState方法中所保存的Bundle对象以参数的形式传递给onRestoreInstanceState方法和onCreate方法(onRestoreInstanceState方法调用时间在onStart方法之后,onResume方法之前,当进行恢复时官方建议使用onRestoreInstanceState方法,不用判断是否为空),Android系统会默认为我们保实现了控件的状态缓存(通过委托思想 即 上级通知下级 Android中这种思想用的很普遍如View绘制和事件分发拦截),每个View都有onSaveInstanceState方法和onRestoreInstanceState方法。
当资源系统配置发生改变时我们不想让我们的Activity销毁和重新创建,那我们应该怎么做呢?我们可以在AndroidMenifest.xml中给Activity指定configChangs属性,如:
1:android:configChanges="orientation" ,当屏幕旋转时我们不想让Activity销毁和创建我们可以给此Activity这样设置。
注意:当你适配的API大于13或包含13时,防止屏幕旋转重建Activity应android:configChanges="orientation|screenSize"。
2:android:configChanges="orientation|keyboardHidden|locale",当你想指定多个值时可以使用“|”连接。
当我们给Activity设置了configChanges属性后,当这些对应的情况发生后,Activity则会回调onConfigurationChanged方法而不会调用onSaveInstanceState和onRestoreInstanceState方法了。
如果用户的手机没有开启重力感应器或者在AndroidManifest.xml中设置了android:screenOrientation,默认情况下,该Activity不会响应屏幕旋转事件。如果在这种情况下,依然希望Activity能响应屏幕旋转,则添加如下代码:
// 在activity的 onCreate 函数中添加
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
转自:http://www.cnblogs.com/PengLee/p/4084692.html
此种情况下的数据存储和恢复的过程和2.2.1的大致情况相同,不同的地方我已知的有 如:onSaveInstanceState方法调用的时机不同。
Activity的优先级:
1:正在和用户交互(可见且前台)的优先级最高。
2:可见但不是前台,如启动一个透明主题的Activity的Activity,优先级次之。
3:不可见而且不在前台,执行了onStop方法且没执行onDestroy方法的Activity,优先级最低。
当一个App的内存不足时会根据Activity的优先级来杀死Activity。
注意:在Android中我们做一些后台工作时最好不要脱离四大组件,因为如果一个进程没有四大组件那这个进程的优先级是比较低的,容易被系统杀死。
参考资料:《Android群英传》第8章
《Android开发艺术探索》第1章