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

【Android开发艺术探索读书笔记】 第一章 Activity的生命周期与启动模式

2017-02-12 14:30 567 查看
生命周期
典型情况下的生命周期分析

异常情况下生命周期分析

启动模式
LaunchMode

IntentFilter
判断

生命周期

典型情况下的生命周期分析

onStart:此时表示Activity正在启动,可以理解为已经可见了,但是还没有出现在前台,还无法与用户交互,即其已经出现,只是用户还看不见。

onResume:表示Activity已经出现在前台并开始活动。

onPause:此时可以做一些停止动画,储存数据等工作,但是不能太耗时间,因为这会影响新Activity的显示,==旧Activity的onPause方法执行完毕,新Activity的才开始启动。==

onStop:表示Activity即将停止,可以做一些稍微重量级的回收工作。

异常情况下生命周期分析

当系统配置发生改变的时候,系统会调用
onSaveInstance
来保存当前Activity的状态,这个方式调用时机是在
onStop
之前,与
onPause
没有特定的关系,有时会在它之前,有时在它之后;当Activity被重建的时候,系统会调用
onRestoreInstance
,并且会把
onSaveInstance
方法所保存的
Bundle
对象传递给
onCreate
onRestoreInstance
,从时序上说,
onRestoreInstance
的调用时机在
onStart
之后。

虽然两种方法都可以恢复数据,但是正常启动的时候
onCreate
的参数为
null
,必须要添加额外判断,而
onRestoreInstance
方法一旦被调用,其参数必定有值。官网文档建议是采用
onRestoreInstance
去恢复数据。

每个View都有
onSaveInstance
onRestoreInstance
这两个方法,可以看一下它们的具体实现,就可以知道它们在系统配置变化时会自动恢复哪一些数据。

可以通过指定Activity的
configChanges
属性来避免特定属性改变导致的重建,取而代之是系统会调用
onConfigurationChanged
,这是就可以做一些特殊处理;我们平时常用的有locale(系统本地位置,一般指系统语言)、orientation(屏幕方向发生改变)、keyboardHidden(键盘访问性发生了改变)

启动模式

LaunchMode

standard:每启动一个Activity就会重新创建一个实例,==谁启动就运行在谁的任务栈中==,此外特别注意一点,当用
ApplicationContext
去启动standard模式Activity的时候会报错,因为其不是Activity类型的Context,所以不具有任务栈,解决方式就是设定
FLAG_ACTIVITY_NEW_TASK
标志位,这个时候启动Activity实际上是以singleTask模式启动的。

singleTop:栈顶复用模式,如果位于任务栈栈顶就不会再次创建,同时,
onNewIntent
方法会被回调。

singleTask:栈内复用模式。只要特定Activity在一个栈中存在就不会创建,此外如果在所有栈中都不存在就会创建一个任务栈,并创建一个实例放入其中。

singleInstance:单实例模式。具有这种模式的Activity只能单独位于一个任务栈中。

TaskAffinity
和singleTask配合使用的时候,待启动的Activity会运行在名字和
TaskAffinity
相同的任务栈中。

allowTaskReparenting
属性为true的时候,此Activity可以被重定向。

IntentFilter

原则上一个Intent不应该既是显式调用又是隐式调用,如果共存以显式为准。

一个Activity中可以有多个
<intent-filter>
,一个Intent只要能匹配任何一组
<intent-filter>
即可成功启动。

要想匹配成功,action是要求Intent中必须要有一个action则必须能够和过滤规则中的某个action相同,data也是类似。此外当存在category的时候,每个都必须能够和过滤规则中任何一个category相同。

如果Intent不设置category,当启动的时候,系统会默认添加
android.intent.category.DEFAULT
这个category。

category中不含有
android.intent.category.DEFAULT
的Activity是无法接收隐式Intent的。

data由mimeType与URI两部分组成,mimeType指媒体类型(image/jpeg、audio/mpeg4-generic、video/*等),URI结构:`://:/[||],==当URI中scheme或者host未指定,则意味着此URI无效。==

如果需要为intent指定完整的data,必须要调用
setDataAndType
方法,不能先调用
setData
再调用
setType
,因为这两个方法会彼此清除对方的值。

判断

当通过隐式方法启动Activity的时候,可以通过PackageManager或者Intent的
resolveActivity
方法查找匹配的Activity,找不到返回
null
。此外,PackageManager还提供
queryIntentActivity
方法,这个方法与
resolveActivity
不同的是,它不是返回最佳匹配的Activity,而是返回所有成功匹配的Activity信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android 读书笔记
相关文章推荐