启动和销毁Activity
生命周期可由下图来说明,

如何实现一个用户期待的app
1 当使用app的时候,不会因为来电或者其它app的界面而导致crash
2 当用户没有激活某个组件的时候不要消耗宝贵的资源
3 当离开你的app并且一段时间后返回,不要丢失用户的使用进度
4 当设备发生屏幕旋转的时候,不会crash或者丢失用户的使用进度
Activity的三种生命状态是可以存在一断比较长的时间,其他几个状态是很快就会切换掉,停留的时间较短
resumed:这个状态Activity是最前端的,用户可与之交互,running
paused:这个状态,Activity被另外一个Activity所遮盖;;另外的Activity来到了最前端,但是不会覆盖整个屏幕,被暂停的Activity不会再接受用户的输入和失去了主线程的控制权。
Stoped:这个状态,Activity被完全覆盖,不被用户可见,可认为在后台,当stoped,Activity的实例与他的所有状态信息都会被保留,但是Activity不能执行任何代码
其它的状态,Created和started都是短暂的,系统会快速执行哪些回调函数,并通过下一阶段回调函数移动到下一个状态。
首次启动的Activity
在android manifest.xml 指定你的那个activity作为主Activity

用户从主界面点击的你的程序时,用户会调用你的app里面的声明为lanucher或者为main的activitity的onCreate()的方法。
note:如果你的app中没有一个Activity声明为Main Action或者LAUNCHER category,那么设备的主界面将不会呈现的你的app图标。
创建一个新的实例
onCreate(), 声明ui元素,定义成员变量,以及配置ui等,尽量少做时间,避免启动太久都看不到界面。
onCreate()执行完成之后,会迅速执行onStart()和onResume(),理论上来说当执行完onStarted的方法之后,就开始能被用户所看下。
销毁Activity
Activity的最后一个生命周期为onDestory(), 系统执行这个方法作为你的activity要从系统中完全移除的信号。
大多数不需要实现这个方法,因为局部的reference会随着activity的销毁而销毁,并且你的Activity应该在onPause()和onStop()去释放资源,清楚资源。然后在你的Activity中包含你onCreate()创建的后台线程,或者其它有可能造成内存泄漏的问题,你应该在onDestory()杀死他们。
note:在Activity中onCreate()调用finish()方法,会直接执行onDestory()的方法,而不会执行其它的生命的周期的方法。
暂停和恢复Activity
前端的Activity有时候会被其它的可见的组件而阻塞,这个会导致Activity进入到暂停的状态,可要这个Activity部分可见,那么的这个Activity会处于的Paused的阶段。
一旦Activity被完全阻塞并完全不可见的时候,它则会进入到Stoped 的状态
暂停你的Activity你需要做的事
1 停止动画或者其它的正在运行的操作,后台线程除外,哪些回导致cpu的浪费。
2 提交没有保存的状态,但是仅仅是用户离开时候期待保存的内容。
3 释放系统资源,例如broadcastReceiver,sensors,或者其它会影响你电量的资源。
4 如果用到camera,选择在onpaused是比较好的地方去释放资源。
避免在onpause()做一些cpu-intensive的工作,比如数据库操作,因为它会导致切换到下一个activity的变得缓慢(下一个activity的onstart()方法会在上一个Activity的onPause()执行完之后执行),把这些工作交给onStop()去做。
停止或者重启Activity
Activity提供了onStop()和onRestart()的方法来允许Activity的停止和重启进行调用,不想暂停的状态是部分阻塞ui的,停止的状态是ui不再可见并且用户的焦点转移到另一个actvity中。
停止和暂停的状态Activity 都会在内存保留实例。
无论什么原因导致Activity 停止,系统总是会在onStop()之前执行onPause()的方法的。
停止Activity你应该做的事
1 释放资源,一旦你的Activity停止了,系统会在不再需要这个Activity时摧毁它的实例(栈结构的问题),防止极端条件下,系统直接杀死你的app,不执行onDestory(),从而造成内存泄漏等问题。
2 尽管onPause()会在onStop()之前调用,你还是应该将CPU intensive的工作放在onStop()来做。
停止状态,系统会自动保存Resumed状态的,不需要我们手动去保存的,及时是在极端条件下,这个Activity被销毁,也会自动保存一些信息。
onRestart()的方法会只在你的Activity从stoped的状态恢复的时候才会被调用,因此你可以在使用来执行一些特殊的恢复工作。
1 创建你在onStop()的清理的资源,重新连接你在onStop()释放的资源
2 用户很可能在在回到这个activity的之前需要过一段时间,所以你可以在onStart()方法中去验证一些东西。比如locationmanager或者有无网络等。
重新创建Activity
当你的Activity是因为用户点击了back键或者Activity通过finish() 来结束自己的系统就丢失Activity实例的概念,因为前面的行为已经意味着你不再需要这个Activity了,然而如果因为系统资源紧张而导致Activity的Destory,系统会在用户回到这个Activity有过这个Activity的纪录,系统会使用哪些保存的纪录数据(描述当Activity被Destory时的状态)来重新创建一个新的Activity的实例。那些被系统用来恢复之前状态而保存的数据被叫做"instanceState",他是用来存放在bundle对象的key-value
为了能使你的Android 系统能够恢复到Activity恢复View 的状态,没个View 都必须有唯一的一个id。
onSaveInstanceState(),为了使额外的数据保存到SaveInstanceState中,当用户离开Activity的时候(比如,打开其它的app或者点击home键 ,即是这种情况可能会被destory(),当系统停止你的Activity,再重新创建的时候才会调用onRestoreInstanceState(),
当你的Activity开始stop的时候,系统会调用onSaveInstanceState(),因为你的Activity可以用键值对的来保存信息,
当你的Activity 被Destory中重建的时候,你可以从系统的传递给你的Activity的Bundle中恢复状态,其中onCreate()和onRestoreInstanceState()回调方法都接受到同样的Bundle的对象。包含着同样的实例的状态信息。
网友评论