文章目录
  1. 1. Activity的生命周期全面分析
    1. 1.1. 典型情况下的生命周期分析
    2. 1.2. 异常情况下的生命周期分析
  2. 2. Activity的启动模式
    1. 2.1. Activity的LaunchMode
    2. 2.2. Activity的Flags
  3. 3. IntentFilter的匹配规则
  4. 4. 分享与支持

来源:JiongBull’s Blog
微博:@JiongBull
GitHub:JiongBull

Activity的生命周期全面分析

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

  • Activity从不可见状态重新变为可见状态时,会调用onRestart()
  • onPause()里不能做耗时的工作,因为会影响新Activity的显示。
  • 如果打开的新Activity启用了透明主题,那么当前Activity不会调用onStop()
  • onStart()onStop()是从Activity是否可见的角度进行回调(可见是针对系统来讲的,对人不可见),onResume()onPause()是从Activity是否可以交互的角度进行回调。
  • Activity A打开Activity B的回调顺序是onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) -> onStop(A)

异常情况下的生命周期分析

  • 系统在Activity可能会被回收之前调用onSaveInstanceState()保存状态信息,调用时机发生在onPause()onStop()之前,没有特定的时序关系。
  • 当Activity被重新创建后,系统会调用onRestoreInstanceState(),并把Activity销毁时在onSaveInstanceState()保存的Bundle对象作为参数同时传递给onRestoreInstanceState()onCreate()onRestoreInstanceState()的调用时机发生在onStart()之后。
  • View都有onSaveInstanceState()onRestoreInstanceState()回调,系统会自动保存和恢复View的状态(一定要给View指定ID才行)。
  • 系统配置发生改变后,Activity会被重新创建,若不想重新创建,可以给Activity指定configChanges属性,系统会调用onConfigurationChanged()

Activity的启动模式

Activity的LaunchMode

  • 一般需要使用Activity的context来启动Activity,除非把待启动Activity的flag设置为FLAG_ACTIVITY_NEW_TASK,就能用非Activity的context启动Activity了。
  • standardsingleTop模式的Activity默认会进入启动它的Activity所属的任务栈中,在跨应用启动Activity时会觉得它们属于同一个应用,在任务管理器观察也是如此,如果同时指定了该Activity的allowTaskReparenting = true并且处于栈顶,那么在启动它原本所在的应用时会回到自己应用的任务栈中。
  • singleTop模式下,如果待启动的Activity已经位于任务栈的栈顶,那么该Activity不会被重新创建,它的onNewIntent()会被回调,onCreate()onStart()都不会被回调。如果该Activity已经存在但不是位于栈顶,该Activity依旧会重新创建。
  • singleTask模式被称为栈内复用模式或单实例模式,只要Activity在栈中存在,多次启动该Activity都不会创建新的实例。
  • singleInstance模式也被称为加强的单实例模式,栈内只会有一个Activity实例。
  • taskAffinity用来指定任务栈的名称,默认情况下,所有Activity所需的任务栈的名字为应用的包名。
  • taskAffinity主要和singleTask(FLAG_ACTIVITY_NEW_TASK)启动模式或allowTaskReparenting配合使用,其他情况下没有意义。
  • 使用adb shell dumpsys activity查看Activity的栈信息。
  • 有两种设置启动模式的方式,第一种在AndroidManifest中指定launchMode,第二种是通过Intent设置标志位来指定启动模式,第二种的优先级比第一种高。

Activity的Flags

  • FLAG_ACTIVITY_NEW_TASK效果与singleTask效果相同。
  • FLAG_ACTIVITY_SINGLE_TOP效果与singleTop效果相同。
  • FLAG_ACTIVITY_CLEAR_TOP常与FLAG_ACTIVITY_SINGLE_TOP配合使用。
  • FLAG_ACTIVITY_CLEAR_TOP从栈顶往栈底匹配最符合的Activity并清除该Activity之上的Activity。

IntentFilter的匹配规则

  • 一个Activity中可以有多个intent-filter,Intent只要能匹配任何一个intent-filter即可成功启动对应的Activity。
  • 一个intent-filter中的action、category和data元素可以有多个,Intent只有完全匹配所有类别才能匹配成功。
  • 如果intent-filter中不包含任何action,那么它不能匹配任何指定action的Intent。
  • Intent要通过category匹配规则的话,在Intent中的每个category都必须匹配intent-filter中的category。反之不必要,intent-filter中声明的category可能比Intent中的还多,但是Intent依然会通过。因此,没有category的intent不管filter里声明了什么category都会通过。
  • 使用startActivity()startActivityForResult()时,Android会自动的在所有的隐式intent中添加CATEGORY_DEFAULT的category,所以如果想要Activity能够接收到这些隐式Intent的话,就必须在它的intent-filter中包含android.intent.category.DEFAULT的category。
  • 每个data元素都可以指定一个URI和MIME,URI的一般结构为<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
  • 如果要为Intent指定完整的data,必须要调用setDataAndType()方法,因为setType()setData()会互相覆盖。
  • PackageManager有一系列的query...()方法,它可以返回所有可以接收某个特定Intent的组件,同样,还有一系列的resolve...()方法,可以找出最适合响应某个Intent的组件。

分享与支持

  • 如果这篇文章对你有帮助,请分享下面的链接让更多人受益。
  • 更多支持,请点这里
文章目录
  1. 1. Activity的生命周期全面分析
    1. 1.1. 典型情况下的生命周期分析
    2. 1.2. 异常情况下的生命周期分析
  2. 2. Activity的启动模式
    1. 2.1. Activity的LaunchMode
    2. 2.2. Activity的Flags
  3. 3. IntentFilter的匹配规则
  4. 4. 分享与支持