最近听说一本很火的Android进阶书籍《Android开发艺术探索》,身边也有好些朋友购买了并极力向我推荐,在看了目录结构后按耐不住果断入手了一本,这正是我们需要的进阶技能get++的极好辅助书籍,我会一边读一边写下笔记,不定时更新
part1-1 正常情况下Activity的生命周期回调
参照官方文档,把这些回调方法归纳为3类
- 完整生命周期:onCreate(),onDestry()
- 可视生命周期:onStart(),onStop()
- 前台生命周期:onResume(),onPause()
- onRestart():Activity由不可视状态变成可视状态时回调
Get:
- onPause()方法中不宜做太耗时操作,因为打开一个新的Activity时,旧Activity的onPause()方法必须先执行完,新Activity的onResume()方法才会执行,如果做了太耗时操作,会影响新Activity显示到前台的速度,用户体验就会down
- 如果在一个Activity中打开一个设置为透明主题的Activity,那么旧Activity不会调用onStop()方法,因为新Activity为透明,旧Activity仍然在后台可视,它仍然处于可视状态,并不会调用onStop()不可视方法。
part1-2 异常情况下Activity的生命周期回调
异常情况为
- 系统配置发生改变时Activity被销毁重建,如横竖屏切换。
- 内存资源不足时被系统gc回收,如在一个透明主题的Activity中打开一个加载大量资源的Activity导致透明主题的Activity被gc回收。
Get:
- 异常情况下导致Activity的退出必然会回调onSaveInstanceState(Bundle outState)方法保存当前Activity的状态和数据和onRestoreInstanceState(Bundle saveInstanceState)方法恢复数据状态方法。
- 当Activity异常退出时,通过onSaveInstanceState(Bundle outState)保存状态数据到outState中,同时通过系统底层传递给onRestoreInstanceState(Bundle saveInstanceState)和onCreate(Bundle saveInstanceState)的saveInstanceState中,在恢复时我们可以选择在其中一个方法即可,但需要注意的是如果在onCreate()方法中恢复必须加上判断if(saveInstanceState!=null)
- 每个View都像Activity一样有onSaveInstanceState()和onRestoreInstanceState()方法保存View的状态和数据。如当我们在TextView中输入字符串时,把手机横竖屏切换让Activity销毁重新创建,该TextView中的字符串仍然显示。
- onSaveInstanceState()方法是在onStop()方法之前回调,onRestoreInstanceState()方法在Activity重新创建后的onStart()之后回调;
- 我们在固定屏幕方向时会经常这样配置,意思是
android:configChanges=”orientation|keyboardHidden|screenSize”
orientation:屏幕方向发生改变,如横竖屏切换
keyboardHidden:键盘的可访问性发生改变,如调出键盘
screenSize:屏幕尺寸发生改变,如切换显示屏幕尺寸
part1-3 Activity的LaunchMode
- standard标准模式:默认的启动模式,按back键栈中的Activity实例就finish出栈,后进先出原则
- singleTop栈顶复用模式:使用此模式的Activity如果处在栈顶,再重新打开该Activity的时候,不会创建新的实例,而是通过onNewIntent()方法复用该实例;如果不存在栈顶,便会重新创建该Activity实例并存放在栈顶
- singleTask栈内复用模式:如果栈中存在Activity的实例,再重新打开该Activity的时候,不会创建新的实例,而是通过onNewIntent()方法复用该实例,并把其之上的其他Activity实例出栈
- singleInstance单实例模式:加强版的singleTask,其实例运行在一个独立的任务栈中
Get:
- 在singleTask模式中,如果栈中不存在Activity的实例,系统会寻找是否存在该Activity想要的栈,不存在就会创建一个新的任务栈来存放该Activity实例
- 可以为每个Activity配置TaskAffinity属性,TaskAffinity指定了Activity想要运行的任务栈,默认为应用包名
- 任务栈分为前台任务栈和后台任务栈,后台任务栈中的Activity处于暂停状态
- FLAG_ACTIVITY_NEW_TASK:使用该标记的Activity使用了singleTask模式
- FLAG_ACTIVITY_SINGLE_TOP:使用该标记的Activity使用了singleTOP模式
- FLAG_ACTIVITY_CLEAR_TOP:使用该标记的Activity会使其之上的其他Activity实例出栈
part1-4 IntentFilter匹配
Get:
- 一个Activity可以有多个intent-filter,一个intent-filter可以有多个action、category、data,一个Intent只要能匹配任何一个intent-filter都能成功开启对应的Activity
- intent中的action必须有一个,并且只要与intent-filter中的任何一个相同就能成功匹配,action属性值区分大小写
- intent中如果存在category,那么这些category必须要和intent-filter中的任何一个相同;intent中如果不存在category,系统在启动Activity时会默认加上android.intent.category.DEFAULL
- data的匹配与action类似。intent-filter中的data由mimeType和URI组成,如果没有指定URI默认为content或者file。通过intent.setDataAndType(Uri.parse(“URI”),”mimeType”)设置
第一章到此结束,内容相对比较少,好理解的,但是还是get了许多知识,以后的章节将会循序渐进