andriod的生命周期
官网拔下来的图。。。
做程序要注意的几个地方
- Does not crash if the user receives a phone call or switches to another app while using your app.
- Does not consume valuable system resources when the user is not actively using it.
- Does not lose the user's progress if they leave your app and return to it at a later time.
- Does not crash or lose the user's progress when the screen rotates between landscape and portrait orientation.
1.用户接电话,或者转向其他应用程序时,程序不能崩溃
2. 用户没有在使用的时候,不要浪费系统资源
3. 用户离开一会儿,回来后,程序进程不能丢失
4. 用户旋转屏幕的时候,程序不会崩溃,程序进程不会丢失
图上那么多个状态里
有三种是静态的,静态是说啊,程序只有在这三种状态下可以持续一段时间
1. Resumed:在前台,可以有交互
2. Paused:被另外的应用程序阻断,程序是半透明,或者没有覆盖整个屏幕,不能接受任何用户输入,不能执行代码
3. Stopped:完全隐藏,用户不可见,在后台。
其他状态会很快的过度到其他状态,比如系统调用onCreate()之后很快的调用了onStart(),然后很快的调用onResume()。
======================神奇的分割线=========================
用户在屏幕上选择了图标之后,系统会调用在应用中被标识位launcher或者main的activity,的onCreate()方法。
在AndroidManifest.xml文件中定义main Activity 以及应用的根目录。
<activity android:name=".MainActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
如果应用程序没有定义这个的话,不会出现在应用程序列表中。
系统通过调用onCreate方法创建新的activity实例。
实现onCreate方法,必须实现基础的应用程序初始逻辑,这逻辑在整个生命周期中只运行一次。
比如:定义用户界面,一些类作用域变量。
用户可以看到界面,是调用了onStart(),但是很快就调用了onResume(),用户会一直停留在这个状态知道有事件打断。
=======================灰过去的分割线=================================
Activity的销毁
onDestroy,系统调用这个结束activity,并将它完全从系统内存中移除。
通常情况下不需要实现这个方法,因为局部的类的应用会随着activity销毁,而且activity应该在onPause()和onStop()中做了多数的清楚。
如果这个activity在onCreate方法中创建有后台线程,或者其他长时间运行的可能造成内存泄露的资源,那么在onDestory中应该kill它们。
在多是情况下,在调用onDestory之前,已经调用了onPause() onStop(),只有一种情况除外。
就是如果在onCreate中调用了finish(),如这个activity是暂时的,为了调用其他的activity。
那么系统会直接调用onDestory,而不会调用生命周期中的其他方法。
======================掉下来的分割线======================================
Pause Activity
onPause需要做的事情
1. 在暂停状态下不应该继续运行的行为,如播放视屏,停止动画或者一些一直运行的消耗CPU的行为
2. 存储信息,以防用户永远离开应用,只需要保存那些用户希望保存的信息,如邮件草稿,而不是说诸如表单中的信息,存储那些确定用户需要缓存的信息。
3. 是否系统资源,如GPS,释放那些可能影响电池生命周期,当暂停时用户不需要使用的资源。
应该避免在onPause中调用如读写数据库等消耗CUP资源的行为,这个会影响当前前台的activity。
这些操作应该在onStop中去做。
在暂停后,activity还是会停留在内存中,不需要在onResume中重新初始化组件。
用户回到暂停的程序,会调用onResume
Resume Activity
每次activity调用到前台都会调用onResume方法,包括第一次创建的时候。
在onResume中应该初始化在onPause中已经释放的组件,和必须每次都初始化的组件。比如动画和那些只有得到用户焦点才使用的组件。
==============================分割线==========================================
stop and restart
情景:
1. 用户通过应用程序管理器选择了另外的程序,之后又选回来
2. 用户在当前应用中起了一个新的activity,就的这个stop了,之后按了back按钮,就的就restart了
3. 用户接了个电话
stop了就肯定看不到了
需要释放所有用不到的资源,系统直接杀掉进程可能会用不到onDestory,所以需要确保这里已经释放了所有可能造成内存泄露的程序。
使用onStop去实现那些更大的,更消耗CPU的操作,如读写数据库。
从stop状态到start状态会调用onRestart
通常在restart的时候重新实例化。
将onStart作为onStop的一个副本。
比如:用户可能离开应用程序一个很长的时间,onStart是一个很好的地方用来检验需要的系统特性是不是可用。
======================华丽丽的分割线============================
每一次旋转屏幕,系统都会销毁activity,并且重建。
如系统资源不足,可能会被系统关闭,再打开就是recreate
默认的,系统会使用Bundle实例对象状态去保存每一个view对象。
如果需要保存更多的东西,使用onSaveInstanceState,如成员变量,用户进程追踪记录。
onSaveInstanceState中传递了一个Bundle对象。
当用户离开activity系统调用这个方法。
如果在系统销毁activity之后,重建,会将同样的Bundle对象,传递给onRestoreinstanceState。
每次重写onSaveInstanceState,都要调用父类的onSaveInstantceState确保系统自动保存相关状态。