Activity是Android应用的重要且最常见的组件。一个应用中往往包含了多个Activity组件,不同的Activity分别会向用户呈现不同的操作界面。当用户进入,退出,回到你的App时,程序中的Activity实例都经历了声明周期中的不同状态。下面笔者就介绍一下Activity中重要一些回调方法。
Activity生命周期重要的回调方法
在Java和C++中,程序的入口是main()方法,但是在Android中,系统会根据Activity的生命周期的不同阶段唤起对应的回调函数来执行代码。系统存在一套如下的有序的回调函数来启动和销毁一个Activity。
上面的图片是Android Dev Guide提供的一个金字塔模型。
在一个Activity的生命周期中,系统会像金字塔模型一样去调用一系列的生命周期的回调方法。当创建一个新的Activity实例,每一个回调函数都会向上一层移动Activity的状态,当移动到顶层的时候,就意味着这个Activity处于可以与用户进行交互的状态;当用户退出这个Activity时,系统会调用相应的方法将Activity向下一层移动它的状态。使Activity处于等待状态(例如当用户切换到了其他的App中),这时Activity可以被重新唤醒(重新回到顶端)。
下面就来依次介绍一下这些回调方法:
- onCreate:当Activity第一次启动的时候触发该方法,可以在此时完成Activity的初始化工作。
- onStart:该方法的触发表示属的Activity将被展现给用户。
- onResume:当一个Activity和用户发生交互时触发该方法。
- onPause:当一个处于前台的Activity(与用户进行交互的Activity)因为其他的Activity的需要而转入后台运行时触发该方法。
- onStop:当一个Activity不需要再展示给用户时触发该方法。但是有些时候系统会直接结束掉这个Activity而不会调用onStop方法,例如内纯紧张的时候。所以对于开发者而言,保存Activity信息的操作应该在onPause中进行操作。
- onRestart:当处于停止状态的Activity需要再次展现给用户时触发该方法。
- onDestory:当Activity销毁时触发该方法。类似于onStop方法,如果内存紧张,系统会直接结束Acctivity而不调用该方法。
另外在Android Dev Guide中特别指出:
(译)根据Activity的复杂度,你也许不需要实现所有的生命周期方法。然而,你需要知道每一个方法的功能并确保你的App能够像用户期望的那样执行。如何实现一个符合用户期待的App,你需要注意下面几点:
- 当使用你的App的时候,不会因为有来电通话或者切换到其他App而导致程序崩溃。
- 当用户没有激活某个组件的时候不要消耗宝贵的系统资源。
- 当离开你的App并且一段时间后返回,不要丢失用户的使用进度。
- 当设备发送屏幕旋转的时候,不会崩溃或者丢失用户的使用进度
如果没有特别的指定,那么如果配置发生了改变(屏幕的旋转,语言的变更等等)将会导致当前的Activity经历一个正常的生命销毁的过程(onPause->onStop->onDestory)。如果一个正在和用户交互的Activity的实例的onDestory方法被调用了,之后再重新启动的该Activity实例,那么之前实例的所有savedInstanceState都会从 onSaveInstanceState(Bundle)方法中获取。
下面我们通过一个小实例来体会Activity的生命周期。代码详见AndroidLifeCycleTest。
在实例中我们创建了两个Activity(MainActivity和AnotherActivity)。并且都调用了上述的七个回调方法。运行实例然后观察控制台输出我们可以得出以下几点: - 当一个Activity被创建的时候,首先触发了onCreate方法,紧接着执行onStart和onResume方法。
- 当Activity在与用户交互时,用户点击了Home键或者进入到其他的Activity时,程序会调用onPause方法和onStop方法。此时用户再返回该Activity,系统会调用onRestart,onStart,onResume方法。
- 如果用户按返回键,系统会调用onPause,onStop,onDestroy方法。
以上。