《Android开发艺术探索》读书笔记--part1 Activity的生命周期和启动模式

来源:互联网 发布:蓝牙软件下载 编辑:程序博客网 时间:2024/05/16 07:01

最近听说一本很火的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了许多知识,以后的章节将会循序渐进

1 0
原创粉丝点击