第1章 Activity 的生命周期和启动模式
生命周期
普通生命周期
1.第一次启动:onCreate -> onStart -> onResume
2.切换:onPause -> onStop
若新Activity采用透明主题,则当前Activity不会回调onStop
3.再次切回:onRestart -> onStart -> onResume
4.back:onPause -> onStop -> onDestory
差异:
onCreate和onDestory只有一次调用
onStart时Activity在后台
onResume时Activity在前台
Activity A 跳转到 Activity B
A onPause -> B onCreate -> B onStart -> B onResume -> A onStop
异常情况下的生命周期
1.资源相关的系统配置发生改变导致Activity被杀死并重建
销毁时:在onDestory之前调用onSaveInstanceState
重建时:在onStart之后调用onRestoreInstanceState,并会给此方法和onCreate传递Bundle
此过程系统会自动为我们保存和恢复一些数据,如文本框中的数据,List滚动的位置
每一个View都有onSaveInstanceState和onRestoreInstanceState方法
Activity保存数据 -> 委托Window保存数据 -> 委托顶级容器保存数据
系统只在Activity异常终止的时候才会调用onSaveInstanceState和onRestoreInstanceState来保存和恢复数据
2.资源内存不足导致低优先级的Activity被杀死
若不想在系统配置发生改变时重建Activity,可以给configChanges添加值
如:
android:configChanges="orientation"
Activity 的启动模式
Activity 的 LaunchMode
1.standrand
标准模式
此模式启动的Activity默认会进入启动它的Activity所属的任务栈中
2.singleTop
栈顶复用模式
onNewIntent方法会被回调
3.singleTask
栈内复用模式
onNewIntent方法会被回调
结合TaskAffinity,可以指定运行的任务栈
4.singleInstance
单实例模式
只能独立的存在一个任务栈中
Tips:任务栈分为前台任务栈和后台任务栈
Activity 的 Flags
Activity的Flags主要包含有:FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_CLEAR_TOP、 FLAG_ACTIVITY_SINGLE_TOP、FLAG_ACITIVTY_EXCLUDE_FROM_RECENTS:具有这个标记的Activity不会出现在历史Activity列表中,当某些情况下我们不希望用户通过历史列表回到我们的Activity的时候这个标记比较有用,它等同于属性设置android:excludeFromRecents="true"
IntentFilter的匹配规则
1.IntentFilter中的过滤信息由action、category、data,为了匹配过滤列表,需要同时匹配过滤列表中的actiion、category、data信息,否则匹配失败。一个过滤列表中的action、category、data可以有多个,所有的action、category、data分别构成不同类别,同一类别的信息共同约束当前类别的匹配过程。只有一个Inten同时匹配action类别、category类别和data类别才算完全匹配,只有完全匹配才能成功启动目标Activity。此外,一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可成功启动对应的Activity。
<intent-filter>
<action android:name="com.ryg.charpter_1.c" />
<action android:name="com.ryg.charpter_1.d" />
<category android:name="com.ryg.category.c" />
<category android:name="com.ryg.category.d" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
2.action匹配规则:只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功,action匹配区分大小写。
3.category匹配规则:Intent中如果有category那么所有的category都必须和过滤规则中的其中一个category相同,如果没有category的话那么就是默认的category,即android.intent.category.DEFAULT,所以为了Activity能够接受隐式低啊用,配置多个category的时候必须加上默认的category。
4.data匹配规则:data的结构很复杂,语法大致如下
<data android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:mimeType="string"/>
data由mimeType和URI组成