Activity:一个Activity是一个应用程序组件(一个容器,可以容纳很多控件),主要是向用户展示界面,并与用于进行交互;
android中使用任务(Task)来管理Activity,一个任务就是一组存放在栈里的活动的集合,这个栈也称作返回栈(Back Stack);栈是一种先进后出的数据结构;
一个应用程序一般由多个Activity组成的;每一个Activity可以启动另外一个Activity(使用Intent等),但前一个Activity就停止了,系统会保留Activity在一个栈(Back Stack)上,新的Activity会被置于栈顶;当按下Back键或调用finish()方法销毁一个Activity时,处于栈顶的Activity会自动出栈,前一个入栈的Activity会被置于栈顶,系统总是将栈顶的Activity显示给用户;
每个Activity都有四种状态:
- 运行状态:当一个Activity位于栈顶时,则处于运行状态;
- 暂停状态:当一个Activity不处于栈顶,但仍可见时;(例:弹出对话框时,后边的Activity仍可见);
- 停止状态:当一个Activity不处于栈顶,完全不可见时;
- 销毁状态:当一个Activity被移出返回栈时;系统会倾向于回收这种Activity,以保证内存充足;
Activity的生存周期:
- onCreate():Activity第一次创建的时候调用;一般加载Layout和进行初始化工作;onCreate()中有个参数可以为null,也可以是之前调用onSaveInstanceState()保存的状态信息;
- onStart():在Activity由不可见变为可见的时候调用;
- onResume():在Activity准备好和用户交互的时候调用,此时Activity一定位于返回栈的栈顶,并处于运行状态;
- onPause():在系统准备启动或恢复一个Activity是调用,通常在这个方法中将一些消耗CPU的资源释放掉以及保存一些关键数据,但这个方法执行速度要快,不然会影响新的栈顶活动的使用;
- onStop():在Activity完全不可见的时候调用;和onPause()的区别是:如果启动的新活动是一个对话框式的活动,那么onPause()会执行,而onStop()不会执行;可以进行一些回收工作,但不能进行耗时工作;当系统内存紧张时,系统会自动回收这个Activity不执行onStop()方法;所以保存状态信息是应该在onPause时做,而不是onStop时做。活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。因此对于开发者来说,在设计应用程序的时候,必须时刻牢记这一原则。在一些情况下,onPause方法或许是活动触发的最后的方法;
- onDestory():当Activity销毁之前调用;和onStop一样,内存紧张时不会执行这个方法;
- onRestart():Activity由停止状态变为运行状态之前调用,即Activity重新启动;
- 一个Activity启动过程:
onCreate()-->onStart()-->onResume()
- 另一个Activity启动:
第一个Activity onPause()-->第二个Activity-->onCreate()-->onStart()-->onResume()-->第一个ActivityonStop();当第二个Activity是弹窗式Activity时,第一个Activity不会执行onStop();
- 当返回到第一个Activity时:
第二个Activity onPause()-->第一个Activity onRestart()-->onStart()-->onResume()-->第二个Activity onStop()-->onDestory();
- 一个Activity的销毁顺序(三种情况):
onPause()-->process kill
onPause()-->onStop()-->process kill
onPause()-->onStop()-->onDestory()
Activity被回收了怎么办:
当一个活动进入停止状态,就有可能被系统回收;当出现这种情况时就需要保存被回收的Activity中的重要数据;
- 保存数据:Activity还提供了onSaveInstanceStae()方法,这个方法保证活动被回收前一定被调用,就可用来保存数据;该方法带有一个Bundle类型参数,Bundle提供了一系列方法用于保存数据;
- 恢复数据:onCreate方法中也有一个Bundle参数,一般情况下都是null,但是如果在活动被系统回收前有通过onSaveInstanceState保存了数据,这个参数就会带有之前所保存的全部数据,只需将数据取出即可;
系统回收Activity优先级:
正在和用户交互(置于栈顶)的Activity优先级最高,其次是可见但无法交互的Activity(没有置于栈顶的Activity),最后是处于停止状态的Activity;
不让Activity重新创建的方法:
将 AndroidMainfest中给Activity指定configChanges属性:
android:configChanges="orientation"
注意事项:
- 当打开新的Activity或者返回桌面时,会调用onPause()和onStop(),当时如果主题是透明的,则不会调用onStop();
- onStart()和onStop()控制Activity可见和不可见状态的转换,而onResume()和onPause()则控制Activity在前台或非前台的转换;
Android的四中启动方式:
可以在AndroidMainfest中给Activity指定launchMode属性决定启动模式;也可以通过Intent的flag来设置;
- standard模式:默认的启动模式,在这种模式下每当启动一个新Activity,就会在返回栈中入栈并处于栈顶位置;对于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈中,每次启动都会创建该活动的一个新的实例;需要按多次返回键才会退出程序;
- singleTop模式: 在启动Activity时如果发现返回栈的栈顶已经是该Activity,则认为可以直接使用它,不需在创建新的Activity;不过如果该Activity不处于栈顶时,再次启动会创建新的实例;
- singleTask模式:可以很好的解决重复创建栈顶Activity的问题;每次启动Activity时系统会首先在返回栈中检查是否存在该活动的实例,如果有则直接使用该实例,并把在这个Activity之上的所有Activity统统出栈,如果没有则创建一个新的活动实例;
- singleInstance模式:在singleInstance模式下会启动一个新的返回栈来管理这个Activity,方便共享Activity;
Intent Flag的启动模式:
Intent.FLAG_ACTIVITY_NEW_TASK:
使用一个新的Task来管理Activity,一般用在Service中启动Activity的场景,以为Service不存在Activity栈;
Intent.FLAG_ACTIVITY_SINGLE_TOP:
类似singleTop
Intent.FLAG_ACTIVITY_CLEAR_TOP:类似singleTask
Intent.FLAG_ACTIVITY_NO_HISTORY:
在该模式下如果启动其他Activity则当前的Activity就会消失,不会保留在Task栈中;
清空任务栈:
- clearTaskOnLaunch:每次返回该Activity时都会清除该Activity之上的所有Activity,通过这个属性可以让Task在每次初始化的时候都只有一个Activity;
- finishTaskOnLaunch:clearOnLaunch作用在其他的Activity上,而finishTaskOnLaunch作用于自身的Activity上;通过这个属性,当离开这个Activity所在Task,当用户返回时该Activity就会finish掉;
- alwaysRetainTaskState:如果将Activity这个属性设置为True,那么该Activity所在的Task将不接受任何清除命令,一直保持当前的状态;
Activity的构成:
Activity的构成不是一个Activity对象加上一个布局文件那么简单,在Activity和开发人员间还隔着两层,实际上视图会被设置给一个Window类,Window类中有一个DecorView,这就是整个窗口的顶级视图,开发人员的布局会被设置到这个DecorView的没ContentParent布局中,这样用户界面就被添加到了系统布局中,而系统会为我们设置好标题栏等区域;
Activity->
PhoneWindow->DecorView->
DefaultLayout->ViewGroup:mContentParent->用户自己的xml布局