您的位置:首页 > 移动开发 > Android开发

开发艺术探索--Activity生命周期和启动模式

2016-10-04 17:26 387 查看

第一章: 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的声明周期方法.

异常情况下

onSavedInstanceState在
onStop之前调用
,和onPause没有既定时序关系.

onRestoreInstanceState在
onStart之后调用
.需要在onCreate中进行判空处理.

View状态保存和恢复采用了委托的思想.
Activity->Window->ViewGroup


如果一个进程中没有四大组件执行,资源不足会很快被系统杀死,比较好的做法是将后台工作放到
Service
中进行

"android:configChanges="orientation|screenSize"
:避免屏幕旋转时
Activity
重建,这时候只会回调
onConfigurationChanged
.

configChanges相关含义:activity

启动模式及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
.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android ipc binder aidl
相关文章推荐