oncreate:表示activity正在被创建。可以做一些初始化UI的工作
onstart:表示正在被启动,activity已经可见了,但还没有出现在前台,无法和用户交互
onresume:activity可见,并且可以和用户交互
onpause:表示activity正在停止
onstop:表示activity暂停,此时被新activity覆盖
onrestart:表示activity正在重新启动,当activity从不可见重新变成可见状态时,onRestart被调用
ondestroy:表示activity即将被销毁,在这里可以做一些资源回收和释放操作
activity第一次启动,会调用oncreate----onstart-----onresume
当用户打开新的activity或返回桌面的时候,会调用onPause-----onstop
当用户再次回到原来的activity时,会调用onrestart-----onstart-----onresume
当用户点击后退键时,会调用onpause-----onstop-----ondestroy
A执行onPause、B执行oncreate、onstart、onresume、A执行onstop
保存数据使用onSaveInstanceState(Bundle outState)方法,使用Bundle对象存储
恢复数据在onCreate中判断Bundle是否为空,或者使用onRestoreInstanceState(Bundle savedInstanceState)
二者的区别:onRestoreInstanceState一旦被调用,参数一定有值,不需要判断参数是否为空
oncreate正常启动bundle值为空,必须额外判断。两个方法都可以进行数据恢复,官方建议采用onRestoreInstanceState恢复数据
activity优先级(从高到底):前台activity---可见但非前台activity(对话框)------后台activity
configChanges属性有很多,我们只列举常用的:
locale:设备的本地位置发生了改变,一般指切换了系统语言
keyboard:键盘类型发生了改变,比如用户使用外插键盘
keyboardHidden:键盘的可访问下发生了改变,比如用户调出了键盘
screenLayout:屏幕布局发生了改变,可能是用户激活了另一个显示设备
fontScale:系统字体缩放比例发生改变,如用户选择了新字体
uiMode:用户界面模式发生改变,比如是否开启了夜间模式
orientation:屏幕方向发生改变,比如旋转手机屏幕
screenSize:当屏幕尺寸发生了改变旋转屏幕时,尺寸会发生变化,当minSdkVersion和targetSdkVersion均低于13时,此项不会导致activity重启,大于等于13会重启
简述:启动activity的时候,系统会创建多个实例并把他们放入任务栈,点击后退的时候会发现activity会一一回退。任务栈是一种后进先出的栈结构。
activity目前有四种启动模式:standard、singleTop、singleTask和singleInstance
standard:标准模式,android系统的默认模式。每次启动一个activity都会重新创建一个新实例,不管这个实例是否已经存在,在这种模式下,谁启动了这个activity,那么这个activity就运行在启动它的那个activity所在的栈中
singleTop:栈顶复用模式。如果新activity已经位于栈顶,那么此activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息。注意:这个activity的oncreate、onstart不会被调动。如果新activity实例存在但不是位于栈顶,那么activity会被重新创建
singleTask:栈内复用模式。只要activity在栈中存在,多次启动此activity都不会重新创建实例,系统会回调onNewIntent,如果没有该activity,则创建并加入栈中
singleInstance:单实例模式。这是一种加强的singleTask模式,除了具有singleTask模式的所有特性外,还具有此种模式的activity只能单独位于一个任务栈中
给activity指定启动模式:有两种方式
第一种:通过AndroidMenifest为activity指定启动模式
android:launchMode=“singleTask”
第二种:通过Intent中设置标志位来为activity指定启动模式
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
二者区别:第二种方式优先级高于第一种,两种方式在限定范围上不同,第一种无法直接为activity设置FLAG_ACTIVITY_CLEAR_TOP标识,第二种无法为activity指定singleInstance模式
activity的Flags有很多,下面列举一些常用的标识位
FLAG_ACTIVITY_NEW_TASK:为activity指定“singleTask”启动模式
FLAG_ACTIVITY_SINGLE_TOP:为activity指定“singleTop”启动模式
FLAG_ACTIVITY_CLEAR_TOP:具有此标记位的activity,当他启动时,在同一个任务栈中所有位于他上面的activiy都要出栈,这个模式需要和FLAG_ACTIVITY_NEW_TASK配合使用。被启动activity的实例如果已经存在,那么系统会调用他的onNewIntent。如果被启动的activity采用standard模式启动,那么他连同他之上的activity都要出栈,系统会创建新的activity实例放入栈顶
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标记的activity不会出现在activity的列表中,当某些情况下我们不希望用户通过历史列表回到我们的activity的时候比较有用,等同于在XML中指定activity的属性android:excludeFromRecents = "true"
IntentFilter的匹配规则
启动activity分为两种,显式调用和隐式调用
显式调用:需要明确指定被启动对象的组件信息,包括包名和类名
隐式调用:需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标activity。IntentFilter中过滤信息有action、category、data
action的匹配规则
action是一个字符串,系统预定义了一些action,也可以在应用中定义自己的action
action的匹配规则是Intent中的action必须能够和过滤规则中的action匹配,值action的字符串完全一致。一个过滤规则中可以有多个action,只要Intent中的action能够和过滤规则中任何一个action相同即可匹配成功
category的匹配规则
category是一个字符串,系统预定义了一些category,也可以在应用中定义自己的category
category匹配规则和action不同,category必须都能够和规矩规则中的任何一个category相同
data的匹配规则
data的匹配规则和action类似,过滤规则中定义了data,那么Intent中必须也要定义可匹配的data
data有两部分组成,mimeType和URI,mimeType指媒体类型,如image/jpeg,URI中包含的数据很多,URI结构
scheme:URI的模式、如http、file、content等
Host:URI主机名、如www.baidu.com
Port:URI中的端口号:如:80,只有RUI中指定了scheme和host参数的才有意义
Path、pathPattern和pathPrefix:path表示完整的路径信息,pathPattern表示完整的路径信息,可以包含通配符“*”,“*”表示0个或多个任意字符,pathPrefix表示路径的前缀信息