第1章 Activity的生命周期和启动模式

1.1 Activity生命周期全面分析

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

  1. Activity从不可见重新变为可见状态时,调用onRestart。
    1. 当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause -> onStop,
    2. 如果新Activity采用了透明主题,那么onStop方法不会被回调。
    3. 当用户再次回到原来的Activity时,回调如下:onRestart -> onStart -> onResume。
  2. 是否可见,onStart和onStop对应;是否前台,onPause和onResume方法对应。
  3. 从Activity A进入到Activity B,调用顺序是onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) -> onStop(A),所以不能在onPause方法中做重量级的操作。

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

1.1.2.1 activity被杀死并重建
  1. Activity被异常终止,在activity即将被系统销毁并且有机会重新显示时,系统会调用onSaveInstanceState。(如acitivty正常关闭不会调用onSaveInstanceState,而旋转屏幕就会调用onSaveInstanceState)
  2. onSaveInstanceState调用时机在onStop之前,和和onPause方法没有既定的时序关系。
  3. 当Activity被重新创建的时候,onRestoreInstanceState会被回调,它的调用时机是onStart之后。
  4. onSaveInstanceState主要用途是保存数据,系统会默认保存当前视图结构。
  5. onRestoreInstanceState主要用途是恢复数据,系统默认恢复的数据有文本框中用户输入的数据、listview滚动的位置等。
  6. 具体针对某一个view系统能为我们恢复哪些数据可以查看view的源码中的onSaveInstanceState和onRestoreInstanceState方法。
  7. 系统调用onSaveInstanceState/onRestoreInstanceState,会委托Window上面的容器去保存/恢复数据,最终会调用view的onSaveInstanceState/onRestoreInstanceState方法。这是典型的委托思想。
1.1.2.2资源内存不足导致低优先级activity被杀死

Activity按优先级的分类

  • 前台Activity;
  • 可见但非前台Activity;
  • 后台Activity

当系统不足时,系统会按照上面优先级杀死activity所在进程,并通过onSaveInstanceState/onRestoreInstanceState存储和恢复数据。

1.1.2.3 android:configChanges="xxx"属性,常用的主要有下面三个选项:

local:设备的本地位置发生了变化,一般指切换了系统语言;
keyboardHidden:键盘的可访问性发生了变化,比如用户调出了键盘;
orientation:屏幕方向发生了变化,比如旋转了手机屏幕。
配置了android:configChanges="xxx"属性之后,Activity就不会在对应变化发生时重新创建,而是调用Activity的onConfigurationChanged方法。

1.2 Activity启动模式

  1. task的概念:是一个Activity的栈,每一个Activity都有一个“所需要的任务栈”——TaskAffinity,默认情况下TaskAffinity就是包名。
  2. 四大模式
    1. standard
    2. singleTop
    3. singleTask
    4. singleInstance
      3 Activity的Flags
    5. FLAG_ACTIVITY_NEW_TASK
    6. FLAG_ACTIVITY_SINGLE_TOP
    7. FLAG_ACTIVITY_CLEAR_TOP
    8. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:它等同于属性设置android:excludeFromRecents="true"。不加入历史列表
  3. 注意事项:
    1. standard模式下,如果是非Activity类型的Context来startActivity,必须加上FLAG_ACTIVITY_NEW_TASK。因为此Context无task,所以必须要新建一个。
    2. singleTask下startActivity有三种情况(D的launchmode是singletask)
      1. S1栈中有ABC, D的TaskAffinity为S2,则新建S2栈,D入栈S2
      2. S1栈中有ABC,D的TaskAffinity为S1,则D入栈S1
      3. D的TaskAffinity为S1,S1栈中有ADBC,则clearTop,最终S1栈中为AD,系统会调用D的onNewIntent(流程为onPause-onNewIntent-onResume)
    3. 任务栈分为前台任务栈和后台任务栈,用户可以通过切换将后台任务栈再次调到前台。
    4. 设置启动模式既可以使用xml属性android:launchMode,也可以使用代码intent.addFlags()。区别在于限定范围不同,前者无法直接为Activity设置FLAG_ACTIVITY_CLEAR_TOP标识,而后者无法为Activity指定singleInstance模式。
  4. 查看activity命令: adb shell dumpsys activity

1.3 IntentFilter匹配规则

  1. action匹配规则
    只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功,action匹配区分大小写。
  2. category匹配规则
    Intent中如果有category那么所有的category都必须和过滤规则中的其中一个category相同,如果没有category的话那么就是默认的category,即android.intent.category.DEFAULT,所以为了Activity能够接收隐式调用,配置多个category的时候必须加上默认的category。
  3. 如何判断是否有Activity能够匹配我们的隐式Intent?
    1. PackageManager的resolveActivity方法或者Intent的resolveActivity方法:如果找不到就会返回null
    2. PackageManager的queryIntentActivities方法:它返回所有成功匹配的Activity信息 针对Service和BroadcastReceiver等组件,PackageManager同样提供了类似的方法去获取成功匹配的组件信息,例如queryIntentServices、queryBroadcastReceivers等方法

你可能感兴趣的:(第1章 Activity的生命周期和启动模式)