Activity的生命周期图:
onCreate :正在创建Activity,会进行一些初始化操作,会调用setContentView去加载布局视图文件
onRestart : 当用户操作Home键,或打开新的activity又回退回来时,会调用
onStart : Activity正在被启动,但当前Activity还没有被加载到前台,不能与用户进行交互.
onResume : Activity启动完成,被加载到了前台,可与用户进行交互,可以理解成获取到了焦点.
onPause : Activity正在停止,也可以理解为Activiy失去焦点
onStop : Activity即将停止
onDestory : Activity即将被销毁
onStart和onStop,onResume和onPause的关系 :
onStart和onStop,是从当前界面可见不可见的角度来分析的;而onResume和onPause是从是否加载到前台,是否能与用户进行交互来分析的.
Activity的自动重启:
1. 资源相关的系统配置发生改变导致Activity被杀死并重新创建.
2. 系统内存不足导致优先级低的Activity被杀死.
onSaveInstanceSate和onRestoreInstanceSate:
Activity正常情况下的关闭,是不会调用onSaveInstanceSate和onRestoreInstanceSate的;
在Activity异常情况下被杀死,例如屏幕旋转,会调用onSaveInstanceSate进行当前Activity状态的保存,其调用和onPause没时间顺序关系,但是在onStop之前;在Activity重启被重新创建的时候会调用onRestoreInstanceState进行数据的恢复,并且还会将在onSaveInstanceSate保存的Bundle对象传递给onCreate和onRestoreInstanceState.
在状态保存中,例如 文本框内被输入的文字,RecycleView滑动的位置等等都会被保存;
其保存的流程为:Activity被杀死前,首先会调用onSaveInstanceState委托其保存数据,而onSaveInstanceState会委托Window保存数据,而Window会委托视图顶级容器去保存数据,视图顶级容器会逐一遍历其子元素,通知他们去进行数据的保存.
防止屏幕旋转:
在请单文件的activity中配置如下属性:
android:configChanges="orientation"
configChanges的其他属性:
Activity的优先级:
- 处于前台的Activity,正在与用户进行交互的Activity,优先级最高
- 可见但非前台的Activity,例如当前正在交互的是一个弹窗,其后面是一个Activity
- 处于后台的Activity优先级最低,在系统运行内存不足时,往往是被杀死的对象.
Activity的四种启动模式:
standard ,singleTop,singleTask,singleInstance
standard :
standard是activity的默认启动模式,每次创建的Activity都会被加入到activity任务栈中.
singleTop:
设定singleTop启动模式的activity如果在栈顶,则不会去重新创建,会使用当前对象,并调用其onNewIntent()函数,如果不在栈顶会重新创建出一个新的activity
singleTask: 至始至终只会存在一个实例对象,在创建之前,首先会看需要的任务栈是否存在如果不存在,就先创建任务栈,再创建activity;如果任务栈存在,那么就查看activity实例对象是否存在,如果不存在就是创建,并放于任务栈栈顶,如果存在且在于任务栈栈顶,则不创建,且调用其onNewIntent()函数,如果存在且不存在于栈顶,则在其上的activity将全部出栈,该activity移至栈顶位置,并且调用onNewIntent()函数,
singleInstance: 具备singleTask所有特性,与之不同的一个在于singleInstance是存在于单独的一个任务栈
Activity的启动方式:
1. 显式启动,就直接指定跳转的activity
2. 隐式启动,通过订单文件中配置的IntentFilter
避免隐示意图跳转空指针:
public abstract List<ResolveInfo>gueryIntentActivities(Intent intent, int flags);
public abstract Resolvelnfo resolveActivity(Intent intent, int flags);
调用PackageManager下的queryIntentActivities或者Intent的resolve,当返回值不为空,跳转则一定成功,其还有一个前置条件,就是第二个参数flag,需要设定为:MATCH_DEFAULT_ONLY,这样只会返回包含有
<category android:name="android.intent.category.DEFAULT" />
的Activity,否则还会返回不含有该category的Activity,在规则中,隐示意图必须含有该category
IntentFilter的匹配规则
IntentFilter包含三类别:action,category,data
一个activity中可以包含有多组IntentFilter,而在activity中只需要匹配成功一组就能够成功跳转
action : 定义一段字符串,且区分大小写,在隐式意图跳转中,Intent必须含有一个action,并且完全匹配定义中的任意一个action
category : 定义一段字符串,在隐式意图跳转中,可以不含有,因为在startActivity或者startActivityForResult,会默认为Intent添加android.intent.category.DEFAULT;如果为了能够支持隐式跳转必须定义一条:
<category android:name="android.intent.category.DEFAULT" />
data:
data由两部分组成,mimeType和URL,mimeType指定媒体类型
在隐式意图跳转中,必须含有一个data
在隐式意图跳转中,必须要使用setDataAndType,如果使用setData或者setType会覆盖掉对方的值
<data android:mimeType="video/*" //指定媒体类型
android:scheme="String" //指定URI的模式,例如http,file,content等等
android:host="String" //指定URI的主机名,例如 http://www.baidu.com
android:port="String" //指定URI的端口号
android:path="String" //指定URI的路径信息
android:pathPattern="String"//指定URI的路径信息
android:prefix="String"/> //指定URI的路径信息
scheme:如果不指定,整个URI都没有意义,但都含有默认的scheme(file,content),但仅只局限于file,content
host:在data中必须指定,如果不指定,整个URI都没有意义
port : 必须是在scheme,host指定后才有意义