记得2010年开始接触Android(Android 1.5),使用Eclipse开发,学完JDK5新特性之后,工作中其实用的是Java6,甚至身边都没有几个人用的是Android手机,当时HTC正火爆,一台便宜的G3都要三千左右的样子,对于刚毕业步入社会的童鞋来说绝对是奢侈品,开发全靠模拟器来做(苦逼脸)。
一、初步认识
学Android接触最早的就是Activity了,四大组件中相对来说也是使用最频繁的组件。毕竟绝大部分的App都是要和用户交互的(极少数特殊的App,例如窃听类的牛虻软件,不需要界面,甚至桌面图标也没有)。Activity简单理解就是和用户交互的、可以看得到摸得着的界面喽。其实Activity本身是没有界面的,所以Activity类创建了一个窗口,开发人员可以通过setContentView(View)接口把UI放到Activity创建的窗口上,当Activity指向全屏窗口时,也可以用其他方式实现:作为漂浮窗口(通过WindowIsFloating的主题集合),或者嵌入到其他的Activity(使用ActivityGroup)。Activity是单独的,用于处理用户操作。几乎所有的Activity都要和用户打交道,所以出去面试Android的职位必须会问到Activity相关的内容。
二、生命周期
去看Google官方的API文档,会看到提供的一张官方图,如下:
2.1 常用的生命周期方法
1.onCreate()
当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。 onCreate 方法有一个参数,该参数可以为空( null ),也可以是之前调用 onSaveInstanceState ()方法保存的状态信息。
2.onStart()
该方法的触发表示所属活动将被展现给用户,“用户可见不可交互”的状态。
3.onResume()
当一个活动和用户发生交互的时候,触发该方法(在Activity栈系统通过栈的方式管理这些Activity,即当前Activity在栈的最上端,运行完弹出栈,则回到上一个Activity)。
4.onPause()
当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。这时候需要将活动的状态持久化、保存起来,比如正在编辑的数据库记录等。
5.onStop()
当一个活动不再需要展示给用户的时候,触发该方法。如果内存紧张,系统会直接结束这个活动,而不会触发 onStop 方法。 所以保存状态信息是应该在onPause时做,而不是onStop时做。活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。因此对于开发者来说,在设计应用程序的时候,必须时刻牢记这一原则。在一些情况下,onPause方法或许是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。
6.onRestart()
当处于停止状态的活动需要再次展现给用户的时候,触发该方法。
7.onDestroy()
当活动销毁的时候,触发该方法。和 onStop 方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。
8.onSaveInstanceState()
系统调用该方法,允许活动保存之前的状态,比如说在一串字符串中的光标所处的位置等。 通常情况下,开发者不需要重写覆盖该方法,在默认的实现中,已经提供了自动保存活动所涉及到的用户界面组件的所有状态信息。
2.2一些操作对应的生命周期流程
一个Activity的启动顺序:
onCreate()——>onStart()——>onResume()
当另一个Activity启动时:
第一个Activity onPause()——>第二个Activity onCreate()——>onStart()——>onResume() ——>第一个Activity onStop()
当前Activity只有执行完onPause(),才会执行新Activity的onResume()。
当返回到第一个Activity时:
第二个Activity onPause() ——> 第一个Activity onRestart()——>onStart()——>onResume() ——>第二个Activity onStop()——>onDestroy()
一个Activity的销毁顺序:
(情况一)onPause()——>< Process Killed >
(情况二)onPause()——>onStop()——>< Process Killed >
(情况三)onPause()——>onStop()——>onDestroy()
用户打开新的Activity或者Home键切换到桌面:
onPause()——>onStop() ,如果新的Activity设置了透明主题,不会回调onStop()
用户按下Back键返回:
onPause()——>onStop()——>onDestroy()
Activity在屏幕旋转时的生命周期:
android:configChanges | 切横屏 | 切竖屏 | 备注 |
---|---|---|---|
不设置 | 1次 | 2次 | |
orientation | 1次 | 1次 | |
orientation keyboardHidden | 0次 | 0次 | 只执行onConfigurationChanged |
生命周期小结
对于整个生命周期来说:
- onCreate和onDestroy是一对,标志着Activity的创建和销毁,并且只可能调用一次。
- 从Activity的是否可见来说,onStart和onStop是一对,随着用户的操作或者屏幕点亮熄灭,可能被调用多次。
- 从Activity是否在前台来说,onResume和onPause是一对,随着用户的操作或者屏幕点亮熄灭,可能被调用多次。
【补充:题外话——android中进程的优先级?】
1 前台进程 > 2 可见进程 > 3 服务进程 > 4 后台进程 > 5 空进程