一:概述:
本文通过Activity的生命周期,启动模式,任务栈来对Activity进行阐述
二:生命周期
1. 正常情况的生命周期
1.1:正常流程:
onCreate():创建,可以在这里面做初始化工作
onStart(): 表示Activity已经启动,但不可交互
onResume(): 可交互状态,说明该Activity已经位于前台
onPause(): 表示Activity正在停止,不能做耗时操作,因为只有onPause()执行完,新的Activity的onResume()才会执行
onStop(): 便是Activity即将停止,同样不能太耗时
onDestroy(): 表示Activity即将被销毁,做一些回收工作和资源释放
onRestart(): 表示Activity重新启动,当一个Activity被按Home键隐藏了的时候,再次重现会调用此方法,就是当一个Activity执行了onPause(), onStop()后又回到这个Activity的情况
1.2:个别情况下生命周期
当按Home键或者调到下一个Activity,在本Activity中执行的生命周期方法为 onPause() onStop()
2.非正常情况的生命周期
2.1:系统配置改变导致Activity被杀死并重新创建
(1)横竖屏切换,home键,会调用onSaveInstanceState(),这个方法在onStop()之前执行,Activity重新创建后,会在onStart()后执行 onRestoreInstanceState(),
(2)listView,textView等这些继承View的类,系统自动为我们保存当前Activity的视图结构
(3)当在清单文件中配置了configChanges="orientation|keyboardHidden|screenSize",横竖屏切换不再重新创建Activity,而是执行 onConfigurationChanged(...)
三:Activity的启动模式
3.1 AndroidMainifest启动模式:
standard: 默认启动模式,每次都创建新的
singleTop: 如果该Activity设置了这个属性,当这个Activity处于栈顶的时候,不需要再创建新的,直接用,通常用于接到消息显示的界面,不用每次 来消息都创建,在第一条弹出的时候创建Activity,第二条都不用了
singleTasek:与singleTop类似,不过它搜索的是整个任务栈,并会把它上面的Activity全部清空,1,如果是其他程序以这个模式启动这个Activity,会创建 一个新的Activity.2.如果启动的模式为singleTase的Activity已经在后台一个任务栈中了,它所在的task会一起会被切换到前台,相当与和本 来前台的task串联起来,压上去。
singleInstance: 与浏览器类似,为这个Activity专门开启一个task,当其他应用再开启时就不用再创建了
注意:当启动模式设置了 singleTop或者singleInstance的activity通过startActivityForResult()来开启另外一个Activity,那么系统将直接返回 Activity.RESULT_CANCELED而不会再去等待,系统在framework层做了对这两种启动模式的限制,一般安卓开发者认为,不同的task,是不能传递数据的,只能通过Intent的传递
当singleTop 和 singleTask中的Activity被复用的时候,onNewIntent()方法会被调用
两种方法可以给Activity指定启动模式,清单文件中的launchMode和通过Intent设置标志位,第二种优先级高
3.2 Intent Flag 启动模式:
系统提供了两种方法可以设置Activity的启动模式,上面是第一种,下面是第二种
Intent.FLAG_ACTIVITY_NEW_TASK: 启动的每个Activity都将在一个新的Task中,这个flag通常用于从service中启 动Activity的场景,因为Service中并 不存在Acti vity栈,所以使用这个flag创建一个新的task
FLAG_ACTIVITY_SINGLE_TOP 与 清单文件中的singleTop效果相同
FLAG_ACTIVITY_CLEAR_TOP 与清单文件中的singleTask效果相同
FLAG_ACTIVITY_NO_HISTORY 当该activity启动其他Activity后,该Activity就消失
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 等同于 xml中的 excludeFromRecents="true" 具有这个标志的Activity不会出现在历史Activity中的列表中
四:Activity的任务栈
4.1 任务栈概述:
1.任务栈分为前台任务栈和后台任务栈,后台任务栈的Activity属于停止状态
2. 默认情况下后进先出,最开始的Activity在栈的最下面 ,同一个app的Activity可能不在同一个栈中,同一个栈也可能有不同APP的Activity
4.2 如何清除任务栈:
clearTaskOnLaunch 添加该flag,每次返回该Activity时,都将该Activity之上所有的Activity清除
finishOnTaskLaunch 与clearTaskOnLaunch属性类似,但它是作用到自己身上,当离开这个Activity所处的task,再返回的时候,这个Activity会被清 除
alwaysRetainTaskState 免死金牌,将这个属性设为true,该Activity所在的task不接受任何清理命令