Activity是四大组件之一,Activity本身是没有界面的,Activity类创建一个窗口,通过setContentView(View)接口把.xml界面放到Activity创建的窗口上。 几乎所有的Activity都要和用户打交道,说简单点就是,我们在手机上看到的界面基本上都是需要一个Activity承载的。
从创建开始到被销毁,会依次调用onCreate->onStart->onResume->onPause->onStop->onDestory
onCreate:创建界面,做一些数据的初始化工作
onStart:用户可见但不可交互的状态
onResume:变成和用户交互的状态
onPause:Activity 可见不可交互,系统会停止动画等消耗CPU的事情
onStop:变得不可见,被下一个Activity覆盖了
onDestory:被kill前最后一个被调用的方法,可能是其他类调用finish方法或者是系统为了节省空间将他暂时性的干掉,可以用isFinishing()来判断。
在一个Activity正常启动的过程中,方法的调用顺序是onCreate->onStart->onResume,被kill掉的顺序是onPause->onStop->onDestory。如果电话突然来了,这是会调用onPause->onStop,接完电话重新回到界面,onStart->onResume,被对话框打断,但此时是透明的onPause。
- 启动Activity
执行onCreate()->onStart()->onResumed()
这个过程执行完,我们的activity就显示在屏幕上。 - 销毁Activity
当执行finish()或者被系统强制杀死时,我们的activity会被销毁,此时activity内部会执行onPause()->onStop()->onDestory() - 暂停和继续
当界面被部分遮挡住,会进入暂停状态,此时会执行onPause(),
当界面重新完全显示后又会回到继续状态(Resumed),会执行onResumed()
在即将Pause时,我们应该在onPause中执行一些释放操作,比如停止正在进行的动画,一些用户的状态(确定用户会保存的,比如邮件草稿),释放系统资源(如广播接收者,传感器),以及其他会消耗电池并且在pause时用户不需要用到的。这些释放或者保存的,我们在onResume的时候需要恢复。 - 停止和重启
用户进去其他界面之后,如接听电话,或者打开其他activity,我们的界面会停止,进入stoped状态。此时会执行onPause()->onStop()
重启时会执行onRestart()->onStart()->onResume()
重启时候和我们创建时相比,多了一步onRestart()
在stop的时候,我们需要执行一些比在onPause中更加消耗CPU的更大任务,比如写数据库。
同时建议,在onStart()中恢复,而不是在onRestart()中恢复。 - 重新创建Activity
当我们的进行被destory(非用户主动调用finish),可以返回。返回的时候会重新创建。执行过程和创建activity一样。
当activity被系统kill之前,会调用onSaveInstanceState()去保存UI状态,如果我们有信息需要保存也可以去重写这个方法去做。
同时我们可以重写onRestoreInstanceState()去恢复状态。不重写,系统会恢复系统保存的那一部分ui,或者我们可以在onCreate中恢复,onCreate的参数saveInstanceState就是我们保存的信息,可以判断改参数是否为空,来恢复界面。
Activity的启动模式
- standard:默认模式,就是新进入的压在已存在的界面之上
- singleTop:栈顶复用模式
- singleTask:栈内复用模式
- singleInstance:栈内单例模式
singleTop
如果新的Activity已经位于任务栈的栈顶,那么此时Activity不会被重新创建,同事onNewIntent()会被回调
如果使用这种模式,那么在任务栈中栈顶到栈底为CBA的情况下,再次打开C,那么界面C的onCreate()和onStart()不会被调用,会调用的是onPause()->onNewIntent()->onResume()。
singleTask
如果是栈内复用,当打开C的时候,会查询所有的任务栈,如果有任务栈包含C,那么把这个任务栈移动到所有栈的首位,并清除掉这个栈内C到栈顶的其他Activity,最后调用C的onNewIntent()方法。如果没有就直接在所需的任务栈的栈顶创建C的实例。
singleInstance
就是singleTask的加强版,当新建Activity时,会重新创建一个新的任务栈,然后创建实例放入这个新的栈内,下一个实例不会和这个Activity所属的栈共存,汇创建一个新的栈继续存.
部分参考:https://isming.me/2014/03/25/manage-activityde-lifecycle/