《Android开发艺术》读书笔记之Activity的生命周期和启动
2016-01-25 00:00
288 查看
《Android开发艺术》读书笔记--Activity启动
###Activity启动生命周期的使用需要主要的要点onStart与onResume的异同?
都表示Activity已经可见,但是onStart的时候Activity还在后台,onResume的时候Activity才显示到前台。
onPause的使用细节?
在该生命周期之中最好只做一些存储数据,停止动画等工作,但是注意不能太耗时,因为这会影响到新Activity的显示,onPause必须先执行完,新的Activity的onResume才能会执行。
####正常使用时的生命周期
一个特定的Activity启动:onCreate->onStart->onResume
当用户打开新的Activity或者切换到桌面时:onPause->onStop
如果新的Activity才用的透明主题,那么当前Activity不会调用onStop。
当用户再次回到原Activity时:onRestart->onStart->onResume
当用户按back键:onPause->onStop->onDestroy
总结:
对于整个生命周期来说:onCreate和onDestroy是配对的,分别标识着Activity的创建和销毁,并且只能调用一次。
对于Activity是否可见来说:onStart和onStop是配对的,这两个可能调用多次。
对于Activity是否在前台来说:onResume和onPause是配对的,这两可能调用多次。
当一个新的Activity被创建被显示的时候,旧的Activity先调用onPause,然后才调用新的Activity的onCreate->onStart->onResume,最后才会调用旧的Activity的onSop方法,所以不能再onPause中调用过于耗时的操作,否则会影响新的Activity的创建
###特殊情况下的生命周期
资源相关的系统配置发生改变导致Activity被杀死并重新创建
当系统配置发生改变时调用顺序:onSaveInstance->onPause->onStop->onDestroy
当Activity被重新创建的时候:onRestoreInstance->onCreate->onStart->...
资源不足导致低优先级的Activity被杀死
Activity的优先级
前台Activity--正在和用户交互的Activity,优先级最高
可见但非前台Activity--比如Activity中弹出一个对话框,导致Activity可见但是位于后台无法和用户直接交互
后台Activity--已经被暂停的Activity,比如执行了onStop,优先级最低
可以通过设置Activity的ConfigChanges属性,使Activity在配置发生改变的时候并不重新创建新的Activity。
###Activity的启动方法
Activity有四种启动模式:standard singleTop singTask singInstance
standard:默认模式,每次启动一个新的Activity都会重新创建一个新的实例,不管这个实例是否存在。
singTop:栈顶复用, 如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建。
singTask:栈内复用,只要一个Activity在一个栈中存在,那么无论调用多次此Activity都不会被重新创建。特殊地,如果需要的Activity存在于栈中,但是不在栈顶时,会清除栈中该Activity之前的Activity,即具有clearTop的效果。
singInstance:单实例模式,加强版的singTask,该模式下的Activity只能处于一个任务栈中。
关于任务栈的解释:
TaskAffinity:任务相关,这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有的任务栈的名字为应用的包名。
allowTaskReparenting:迁移一个Activity到其他的任务栈。这个属性可以这样理解,现在有两个应用A和B,如果应用A启动了B的MainActivity,并且B的allowTaskReparenting被设置为true,那么当按home键退出MainActivity时,再按B应用的时候用直接到达MainActivity页面,而不是重新启动应用B,原因是:当A启动了B的MainActivity时,会查找自己所需要的任务栈,讲道理的话,这个Activity应该属于A任务栈中的,因为是被A启动的,但是该Activity属性allowTaskReparenting="true",那么该Activity就会重新创建一个属于应用B的任务栈,并从A任务栈中移动到B的所属任务栈。当启动任务B的时候,按道理,会重新创建一个B的任务栈,但是由于之前已经通过MainActivity创建过了,所以就不需要再次创建,直接执行栈中的页面就Ok了。这也就是allowTaskReparenting属性的特殊用法。
####Activity的Flags
FLAG_ACTIVITY_NEW_TASK:为Activity指定“singTask”启动模式,其效果和在XML中指定该模式相同。
FLAG_ACTIVITY_SINGLE_TOP:指定Activity为“singTop”模式。
###IntentFilter的匹配规则
#####匹配条件:
只有匹配了所有的action/category/data,才可以启动一个Activity,否则匹配失败。
一个Activity可以有多个intent-filter,一个Intent只能匹配任何一组intent-filter即可成功启动对应的Activity
#####名词解释:
action:是一个字符串,action的匹配规则是Intent中action必须和过滤规则中的action匹配,且和action字符串中的值完全一样。一个匹配规则可以有多个action,只要Intent中的过滤规则中任何一个相同即可匹配,区分大小写。
category:和action不同,它要求Intent中category必须包含于过滤规则中的每一个category。
data:如果过滤规则中定义了data,那么Intent中必须也要定义可匹配的data。
data由两部分组成,mimeType和URI.
mimeType:指媒体类型,比如image/jpeg等
URI:包含具体的媒体的地址,格式为
<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattrn>].
scheme:URI的模式,比如http/file
Host:URI的主机名。
Port:URI的端口号。
path/pathPattern/pathPrefix
匹配时,它要求Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data
相关文章推荐
- adb命令
- sdk manager更新失败
- Android TextView 加滚动条
- android:windowSoftInputMode属性
- Android组件式开发(2)——实现网格布局的RadioButton矩阵
- Android LayoutInflate的基本知识
- Android基础之本地广播及文件存储和SharedPreference存储
- Android ActionBar使用
- 常用Android工具类
- [Android]我对View的认识
- android mvp快速开发框架介绍(dileber使用之小工具使用)
- 新浪微博Android-SDK分享网页功能
- Android中的NavigationDrawer的分析
- Android 中的 ContentProvider
- ListView学习(二)-ListView缓存机制
- 为ViewPager添加适配器
- android mvp快速开发框架介绍(继续dileber)
- Android基础_3 Activity相对布局
- Android 加载图片优化(一)
- Android基础_2 Activity线性布局和表格布局