直接上图来看,图片很清晰的反映了Activity的声明周期
根据Activity的复杂程度,可能不需要实现所有的声明周期方法,但需要了解每一个方法调用的时间,确保能够得到期望的结果,需要注意:
1、当试用你的app的时候,不会因为有来电通话或者切换到其他app而导致程序crash
2、当用户没有激活某个组件的时候不要消耗宝贵的系统资源
3、当离开你的app并且一段时间后返回,不要丢失用户的使用进度
4、当设备发生屏幕旋转的时候,不会crash或者丢失用户的使用进度
图中所示的几个生命状态,只有三个是静态的,这三个状态下的Activity可以存在一段比较长的时间
Resumed:这个状态,Activity处在前台,用户可以与它进行交互(稍后介绍实际开发中的细节)
Paused:这个状态,Activity被另一个Activity所遮盖,另外的Activity来到前台,但是半透明的,不会覆盖整个屏幕。被暂停的Activity不会再接受用户的输入且不会执行任何代码(不代表任何后台线程都不会工作)
Stopped:这个状态,Activity被完全隐藏,不被用户可见,可以认为是在后台。当Stopped,Activity实例与它的所有状态信息都会被保留,但是Activity不能执行任何代码。
其他状态都是短暂的(Created和Started),系统快速的执行那些回调函数,并通过执行下一阶段的回调函数移动到下一个状态。也就是说,在系统调用onCreate(),之后会迅速调用onStart(),之后再迅速执行onResume()。
从技术上严格来说,当执行onStart()方法的时候,Activity就已经被置于前台,用户可见了,但是由于该状态是短暂的,所以会立刻执行到onResume方法。
我们通常把一些动态改变的代码(例如从服务器获取实时的更新)写到onResume()方法中而不是onStart()方法中,这是因为从图中可以了解到,当Activity被停止后,重新开始Activity后会依次执行onStart()方法和onResume(),但是当Activity被暂停,重新开始Activity只执行onResume()方法。所以一般情况下写到onResume()方法中是很稳妥。
在了解到Activity的生命周期的各个状态后,我们可以很清楚的控制Activity来在不同的状态下进行不同的处理,以达到优化app的目的
当系统调用Activity中的onPause(),从技术上讲,意味着Activity仍然处于部分可见的状态,但是大多数时候,那意味着用户正在离开这个Activity,所以我们做一下事情,来优化我们的app:
1、停止动画或者是其他正在运行的操作,这些都会导致CPU的浪费
2、提交没有保存的改变,但是仅仅是在用户离开时期待保存的内容(例如邮箱草稿)
3、释放系统资源,例如Broadcast、sensors(比如GPS)或者其他任何会影响到电量的资源
通常,不应该试用onPause()来保存用户改变的数据(例如填入表格中的个人信息)到永久存储。应当避免在onPause()时执行CPU-intensive的工作,例如写数据到DB,因为它会导致切换到下一个Activity变得缓慢,应该防盗onStop()去做
如果你的Activity实际上是要被Stop,那么你应该为了切换的顺畅而减少在onPause()方法里面的工作量
更新中。。。
当用户从Paused状态恢复Activity时,在onResume()方法中实现在onPause()方法里面释放掉的组件
当你的App里面执行启动另一个Activity时,当前Activity会停止,用户按返回键返回,Activity就先后执行onStop()和onStart()。
在onStop()方法中执行shut-down操作,例如往数据库中写信息
当Activity已经停止,Activity对象会被保存在内存中(除非内存不够用,由系统主动释放),因此在onResume()方法中不需要重新初始化那些被保存的组件。系统同样保存了每一个布局视图的当前状态,如果用户在EditText中输入了字符串,它会被保存,并不需要进行特殊的保存与恢复操作
Activity在每次把页面置于前台时都会调用onStart()方法,而只有调用了onStop()然后恢复才会调用onRestart()方法,所以在onStart()方法中执行一些操作是稳妥的,如非必要,尽量在onStart()而不是onRestart()方法中添加需要的代码。
在onStop方法里面做释放资源的操作,那么onDestory方法则是你最后去清除那些可能导致内存泄漏的地方。
看了好多android的书,关于Activity生命周期都会“隆重”的介绍,说明了它的重要性。准确的理解Activity的生命周期,不仅可以让我们在控制代码执行顺序的时候游刃有余,而且可以极大的提高程序的执行效率。