android进阶(一)-----activity的生命周期和启动模式

一、activity生命周期

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

 

面试题:两个activityA和B,从A跳转到B,会执行那些生命周期?

A执行onPause、B执行oncreate、onstart、onresume、A执行onstop

 

面试题:当activity发生异常时,如何保存数据?

保存数据使用onSaveInstanceState(Bundle outState)方法,使用Bundle对象存储

恢复数据在onCreate中判断Bundle是否为空,或者使用onRestoreInstanceState(Bundle savedInstanceState)

 

二者的区别:onRestoreInstanceState一旦被调用,参数一定有值,不需要判断参数是否为空

oncreate正常启动bundle值为空,必须额外判断。两个方法都可以进行数据恢复,官方建议采用onRestoreInstanceState恢复数据

 

activity优先级(从高到底):前台activity---可见但非前台activity(对话框)------后台activity

 

二:activity横竖屏切换:使用configChanges=“”

configChanges属性有很多,我们只列举常用的:

locale:设备的本地位置发生了改变,一般指切换了系统语言

keyboard:键盘类型发生了改变,比如用户使用外插键盘

keyboardHidden:键盘的可访问下发生了改变,比如用户调出了键盘

screenLayout:屏幕布局发生了改变,可能是用户激活了另一个显示设备

fontScale:系统字体缩放比例发生改变,如用户选择了新字体

uiMode:用户界面模式发生改变,比如是否开启了夜间模式

orientation:屏幕方向发生改变,比如旋转手机屏幕

screenSize:当屏幕尺寸发生了改变旋转屏幕时,尺寸会发生变化,当minSdkVersion和targetSdkVersion均低于13时,此项不会导致activity重启,大于等于13会重启

 

三:activity的LaunchMode

简述:启动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

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表示路径的前缀信息

 

你可能感兴趣的:(android进阶,android高级,android生命周期,android启动模式,显式,android进阶)