您的位置:首页 > 其它

Activity生命周期和启动模式

2016-05-23 21:28 162 查看
Activity的生命周期分为两个部分,一部分是典型情况下的生命周期,另一部分是异常情况下的生命周期。

onCreate()他会在Activity第一次被创建时调用,通常完成Activity的初始化操作,如设置布局、初始化试图、绑定事件等。

onStart()此时的Activity还处在不可见状态、它的下一个状态就是Activity变得可见的时候,也就是这个函数在Activity可见之前被调用。这个时候Activity已经显示出来了,但是我们看不到。

onResume()这个函数在Activity变为可见时被调用,执行完这个函数后,Activity就会请求AMS渲染它所管理的试图。Activity已经可见了,另外onStart的时候Activity还在后台,onResume的时候Activity才显示到前台。

onPause()在Activity即将从可见状态变为不可见时调用。我们通常会在这个函数中将一些消耗CPU的资源释放掉,以及保存一些关键数据。这个函数不能做太耗时的操作,因为这会影响到新的Activity的显示,onPause必须先执行完,新Activity的onResume才会执行。

onStop()在Activity完全不可见时调用。如果新启动的Activity是一个对话框Activity或透明主题的Activity,那么该函数并不会被执行。可以做一些稍微重量级的回收工作,同样不能太耗时。

onRestart()这个函数在Activity由停止状态重新变为运行状态之前调用。

只有onResume和onStop函数之间的Activity是可见的。从Activity是否可见来说,onStart和onStop是配对的;从Activity是否在前台来说,onResume和onPause是配对的。

Android运行的基本机制在不同Android版本上具有延续性。Android官方文档对onPause的解释有这么一句,不能在onPause中做重量级的操作,因为必须onPause执行完成以后新Activity才能Resume,也意味着我们应当尽量在onStop中做操作,从而使得新Activity尽快显示出来并切换到前台。

当旋转屏幕,在默认情况下,Activity就会被销毁并且重新创建,当然我们也可以阻止系统重新创建我们的Activity。同时由于Activity是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity状态,这个方法的调用时机实在onStop之前。onRestoreInstanceState的调用时机在onStart之后。

当Activity在异常情况下需要重新创建时,系统会默认为我们保存Activity的视图结构。和Activity一样,每个view都有onSaveInstanceState和onRestoreInstanceState方法。关于保存和恢复view层次结构,系统的工作流程是这样的,

Activity调用onSaveInstanceState去保存数据,然后Activity会委托Window去保存数据,Window再委托顶级容器去保存数据,顶级容器一般是DecorView,最后顶层容器再去一一通知它的子元素来保存数据。

当系统内存不足时,如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死。

如果不想让Activity在屏幕旋转的时候重新创建,就可以给configChanges属性添加orientation这个值。SdkVersion大于13的话,还要加上screenSize。这样配置的话,Activity就不会调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,取而代之的是系统调用了Activity的onConfigurationChanged方法。

Activity的构成并不是一个Activity对象再加上一个布局文件那么简单,在Activity和开发人员设置的试图之间还隔着两层。实际上试图会被设置一个window类,window中含有一个Decorview,它是整个窗口的顶级视图。开发人员设置的布局会被设置到这个Decorview的mContentParent布局中。我们的Activity之下有一个PhoneWindow类,它是window的实现类,然后window之下包含一个Decorview,它是页面的顶级视图。并且在运行时将开发人员设置给Activity的布局资源添加到系统布局的mContentParent中,系统布局会为我们设置好标题栏等。在Activity的onResume函数被调用之后,用户界面就显示在我们面前了。

Activity的启动模式有四个,standard、singleTop、singleTask、singleInstance。singleTask模式是常用的启动模式,如果Activity设置了该启动模式,那么在一个任务栈中只能有一个该Activity实例。如果任务栈中还没有该Activity,会新创建一个实例并放在栈顶。如果已经存在,系统会销毁处在该Activity上的所有Activity,singleTask默认具有clearTop的效果最终让该Activity实例处于栈顶,同时回调该Activity的onNewIntent函数。singleInstance模式的Activity会在一个独立的任务中开启,与singleTask不同的是,同一时刻在系统中只会存在一个这样的Activity实例,而singleTask模式的Activity是可以有多个实例的,只要这些Activity在不同的任务栈中即可。

假设目前有2个任务栈,前台任务栈的情况为AB,而后台任务栈的情况为CD,CD的启动模式为singleTask。现在B启动D,那么整个后台任务栈都会被切换到前台,这个时候整个后退列表为ABCD。

TaskAffinity任务相关性,这个参数标识了一个Activity所需要的任务栈的名字,默认Activity的任务栈的名字为应用的包名,我们可以为每个Activity单独指定TaskAffinity,该属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用。

当TaskAffinity和singleTask启动模式配对使用的时候,它是具有该模式的Activity的目前任务栈的名字,待启动的Activity会运行在名字和TaskAffinity相同的任务栈中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  activity