第一章: Activity生命周期和启动模式
本章包括: 声明周期,启动模式及IntentFilter的匹配规则.
生命周期
启动模式
IntentFilter
生命周期
典型情况下: 用户参与下,生命周期的改变
异常情况下: 被系统回收或者Configuration改变重建
- 典型情况下
- 当用户按下Home后回来:
onPause -> onStop -> onRestart -> onStart ->onResume
. onStart
和onResume
时Activity
已经可见,`onStart
还在后台,onResume
在前台.- onPause:
保存数据,停止动画
等工作,但不能太耗时
.因为执行完才会打开新的Activity
- onStop:
稍微重量级的回收工作
,也不能太耗时
. - 如果
Activity采用了透明主题
,那么不会回调onStop
. onStart与onStop
对应Activity是否可见
,onResume与onPause
对应Activity是否在前台
(多次调用).onPause
执行完后新的Activity的onResume
才会执行.见ActivityStack#resumeTopActivityInnerLocked
ApplicationThread#scheduleLaunchActivity
回调Activity的声明周期方法.
- 当用户按下Home后回来:
- 异常情况下
- onSavedInstanceState在
onStop之前调用
,和onPause没有既定时序关系. - onRestoreInstanceState在
onStart之后调用
.需要在onCreate中进行判空处理. - View状态保存和恢复采用了委托的思想.
Activity->Window->ViewGroup
- 如果一个进程中没有四大组件执行,资源不足会很快被系统杀死,比较好的做法是将后台工作放到
Service
中进行 "android:configChanges="orientation|screenSize"
:避免屏幕旋转时Activity
重建,这时候只会回调onConfigurationChanged
.- configChanges相关含义:activity
- onSavedInstanceState在
启动模式及Flags
- Activity的四大启动模式,之前的总结 Activity任务栈及启动模式
adb shell dumpsys activity
: 获取activity堆栈信息.
IntentFliter
- 一个Activity可以有
多个IntentFilter
,只要能匹配任何一组即可成功
启动对应Activity action
: 有其一匹配即可,- action是一个字符串,区分大小写。
- Intent中必须有一个action,且必须能够和过滤规则中的某个action相同
category
: 可以没有,有则必有其一匹配.- 可以没有
category
,系统会默认加上android.intent.category.DEFAULT
- 一旦有
category
,不管有几个,每个都要和过滤规则中的 任何一个category
相同。 - 为了
activity
能够接受隐式调用,最好加上android.intent.category.DEFAULT
这个category
.
- 可以没有
data
: 必须有一个完全匹配,data
有mimeType
和URI
组成,其中URI
包括:scheme,host,port,path
.- 如果
data
只有mimeType而没有指定URI
,则URI
默认值是content和file
data
中的setData
和setType
冲突,需使用setDataAndType
- 隐式调用前最好使用
resolveActivity
来判空(加上MATCH_DEFAULT_ONLY
) - 系统建议使用
显示的方式
来启动服务. Intent-fliter
的匹配规则对于Service
和BroadcastReceiver
也是同样的道理。
public abstract List<ResolveInfo> queryIntentActivities(Intent intent,
@ResolveInfoFlags int flags);
public abstract ResolveInfo resolveActivity(Intent intent, @ResolveInfoFlags int flags);
这两个方法,需要注意后一个参数 ,需要用MATCH_DEFAULT_ONLY
来匹配android.intent.category.DEFAULT
这个category
.