• 生命周期
  • Activity 栈

生命周期

  1. 整体介绍
# 完整流程
onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy

# 切到后台时不可见,缓慢切回
onStop -> onRestart -> onStart -> ....


# 暂停回来,两个 Activity 快速切回
onPause -> onResume -> ...

# 被杀死
onStop -> killed -> onCreate -> ....
  1. 各个阶段

    • onCreate: 初始化
    • onStart: 已经可见,但是无法交互
    • onResume: 可见,且可以交互
    • onPause: 暂停,在前台并可见,可以进行暂存数据,不能太耗时
    • onStop: 不可见,无法交互,但还在内存中,未被销毁,进行资源回收
    • onDestroy: 不可见,Activity 进行销毁,进行资源回收
    • onRestart: 重新打开出发
  2. 几个问题

    1. 如果所有的初始化都在onCreate()中实现,会有什么问题?

      • 初始化的动画是无效的

      • 切到后台后 Activity 再次展示(onPause -> onResume ->...),可能需要初始化,此时不会被调用

    2. 如果所有的初始化都在onStart()中实现,会有什么问题?

      • 切到后台后 Activity 再次展示(onPause -> onResume ->...),可能需要初始化,此时不会被调用
      • 官方推荐布局设置,view 绑定,放到 onCreate
    3. 如果把所有的去初始化都在onStop()中实现,会有什么问题?

      • onResume() 的注释中,建议是在onResume()中打开独占设备(比如相机),与onResume()对应的是onPause(),所以所有的去初始化操作放在**onStop()**中执行,可能会引出新的问题;
      • onStop() 的注释中明确地写了,在内存不足而导致系统无法保留此进程的情况下,onStop() 可能都不会被执行。
    4. A -> B,会执行 A#onPause() -> B#onCreate -> B#onStart -> B#onResume -> A#onStop()

  1. 四种基础模式 (核心,把握好栈的跳转)

    • standard,标准方式,类似于对象的创建

      standard 在同一个栈中时,会创建新的对象

    • singleInstance,全局唯一的栈中的单例,single activity 全局单例

      Main -> ANormal -> SingleInstance -> BNormal -> SingleInstance -> BNormal

      补充,此时,一直返回键

      经历的过程就是出栈逻辑,同时注意当前一个栈退出以后,后面的栈会补上

      BNormal -> BNormal -> ANormal -> Main -> SingleInstance

      核心是 SingleInstace 不在同一个栈

      Main -> ANormal
      |                       |     
      |     前台               |                                                                                      
      |                       |     
      |                       |     
      |-----------------------|     
      |                       |     
      |     ANormal           |     
      |                       |     
      |-----------------------|     
      |                       |     
      |     Main              |     
      |                       |     
      |-----------------------|
      
      
      Main -> ANormal -> SingleInstance
      
      |                       |      |                       |
      |                       |      |                       |
      |     后台               |      |       前台             |
      |                       |      |                       |
      |-----------------------|      |-----------------------|
      |                       |      |                       |
      |          ANormal      |      |                       |
      |                       |      |                       |
      |-----------------------|      |-----------------------|
      |                       |      |                       |
      |           Main        |      |      SingleInstance   |
      |                       |      |                       |
      |-----------------------|      |-----------------------|
      
      
      Main -> ANormal -> SingleInstance -> BNormal
      
      					前台
      |-----------------------|      |                       |
      |                       |      |       后台             |
      |          BNormal      |      |                       |
      |                       |      |                       |
      |-----------------------|      |-----------------------|
      |                       |      |                       |
      |          ANormal      |      |                       |
      |                       |      |                       |
      |-----------------------|      |-----------------------|
      |                       |      |                       |
      |           Main        |      |      SingleInstance   |
      |                       |      |       onCreate        |
      |-----------------------|      |-----------------------|
      
      
      Main -> ANormal -> SingleInstance -> BNormal -> SingleInstance
      
      				后台 
      |-----------------------|      |                       |
      |                       |      |                       |
      |          BNormal      |      |         前台           |
      |                       |      |                       |
      |-----------------------|      |-----------------------|
      |                       |      |                       |
      |          ANormal      |      |                       |
      |                       |      |                       |
      |-----------------------|      |-----------------------|
      |                       |      |                       |
      |           Main        |      |      SingleInstance   |
      |                       |      |       onNewIntent     |
      |-----------------------|      |-----------------------|
      
      
      Main -> ANormal -> SingleInstance -> BNormal -> SingleInstance -> BNormal
      
      				前台 
      |-----------------------|
      |                       |
      |          BNormal      |
      |                       |
      |-----------------------|      |                       |
      |                       |      |                       |
      |          BNormal      |      |       后台             |
      |                       |      |                       |
      |-----------------------|      |-----------------------|
      |                       |      |                       |
      |          ANormal      |      |                       |
      |                       |      |                       |
      |-----------------------|      |-----------------------|
      |                       |      |                       |
      |           Main        |      |      SingleInstance   |
      |                       |      |                       |
      |-----------------------|      |-----------------------|
      
      此时返回,整个过程 BNormal -> BNormal -> ANormal -> Main -> SingleInstance
      
      
    • singleTask,一个栈中有且仅有一个单例,single activity in task,如果没有 task,会创建,如果有,直接跳转,自带 clearTop 功能,onNewIntent 接收

      以下是同一个 Task 中的跳转介绍,关于创建 task 的例子,在 taskAffinity 中会进行举例

       Main -> ANormal                              Main -> ANormal -> SingleTask
                                                    |                       |
                                                    |      SingleTask       |
                                                    |       (onCreate)      |
                                                    |-----------------------|
       |                       |                    |                       |
       |     ANormal           |    ========>>>>    |          ANormal      |
       |                       |                    |                       |
       |-----------------------|                    |-----------------------|
       |                       |                    |                       |
       |     Main              |                    |           Main        |
       |                       |                    |                       |
       |-----------------------|                    |-----------------------|
      
      
      Main -> ANormal -> SingleTask -> BNormal									
       |-----------------------|
       |                       |
       |          BNormal1     |
       |                       |
       |-----------------------|                                      
       |                       |                                      
       |       SingleTask      |                                      
       |                       |                                      
       |-----------------------|                                      
       |                       |                                      
       |          ANormal      |                     
       |                       |                                      
       |-----------------------|                                      
       |                       |                                      
       |           Main        |                                      
       |                       |                                      
       |-----------------------|     
       
       
      Main -> ANormal -> SingleTask -> BNormal -> SingleTask
       |-----------------------|    
       |                       |    
       |       SingleTask      |    
       |       (onNewIntent)   |    
       |-----------------------|    
       |                       |    
       |          ANormal      |    
       |                       |    
       |-----------------------|    
       |                       |    
       |           Main        |    
       |                       |    
       |-----------------------|  
       
       
       Main -> ANormal -> SingleTask -> BNormal -> SingleTask -> BNormal
       |-----------------------|
       |                       |
       |          BNormal2     |
       |                       |
       |-----------------------|
       |                       |
       |       SingleTask      |
       |                       |
       |-----------------------|
       |                       |
       |          ANormal      |
       |                       |
       |-----------------------|
       |                       |
       |           Main        |
       |                       |
       |-----------------------|
      
    • singleTop,single activity on top,如果要跳转的 Activity 在栈顶,那直接跳转原有 Activity,并且回调 onNewIntent,否则会创建一个新的。

      配合 Intent.FLAG_ACTIVITY_CLEAR_TOP,可以模拟 SingleTask 的功能,

      # 非栈顶,创建新的
      ANormal -> SingleOnTop1 -> BNormal -> SingleOnTop2
      
      # 栈顶,复用栈顶
      ANormal -> SingleOnTop1(onCreate) -> SingleOnTop1 (onNewIntent)
      
      # SingleTask 功能
      ANormal -> SingleOnTop1(onCreate) -> BNormal --[Intent.FLAG_ACTIVITY_CLEAR_TOP]--> SingleOnTop1(onNewIntent)
      
  2. taskAffinity 属性

    1. taskAffinity 与 standard 模式配合无用
  1. 配合 SingleTask 使用
  2. 配合 allowTaskReparenting 使用
  3. 配合 Intent.FLAG_ACTIVITY_NEW_TASK 使用
  • 配合 SingleTask 使用,先给出整个跳转流程:

    **Main -> ANormal **

    **-> SingleTask2(taskAffinity = io.test, onCreate) -> BNormal(taskAffinity = io.test) **

    -> SingleTask(taskAffinity = io.dove.offer) -> BNormal(taskAffinity = io.dove.offer)

    -> SingleTask2(taskAffinity = io.test, onNewIntent)

    
    Main -> ANormal
    |-----------------------| 
    |                       |
    |     ANormal           |
    |                       |
    |-----------------------|
    |                       |
    |     Main              |
    |                       |
    |-----------------------|
    
      
    Main -> ANormal -> SingleTask2(taskAffinity = io.test,onCreate)
    |-----------------------| 
    |                       |
    |          ANormal      |
    |                       |
    |-----------------------|       |-----------------------|
    |                       |       |      SingleTask2      |
    |           Main        |       |       (onCreate)      |
    |       io.dove.offer   |       |       io.test         |
    |-----------------------|       |-----------------------|
    
    
    Main -> ANormal -> SingleTask2(taskAffinity = io.test,onCreate) -> BNormal(taskAffinity = io.test)
    |-----------------------|    |-----------------------|
    |                       |    |                       |
    |          ANormal      |    |          BNormal      |
    |                       |    |                       |
    |-----------------------|    |-----------------------|
    |                       |    |      SingleTask2      |
    |           Main        |    |       (onCreate)      |
    |                       |    |       io.test         |
    |-----------------------|    |-----------------------|
    
    
    Main -> ANormal -> SingleTask2(taskAffinity = io.test,onCreate) -> BNormal(taskAffinity = io.test) -> SingleTask(taskAffinity = io.dove.offer)
    |-----------------------| 
    |      SingleTask       |
    |       (onCreate)      |
    |                       |
    |-----------------------|    |-----------------------|
    |                       |    |                       |
    |          ANormal      |    |          BNormal      |
    |                       |    |                       |
    |-----------------------|    |-----------------------|
    |                       |    |      SingleTask2      |
    |           Main        |    |       (onCreate)      |
    |        io.dove.offer  |    |       io.test         |
    |-----------------------|    |-----------------------|
    
      
    Main -> ANormal -> SingleTask2(taskAffinity = io.test,onCreate) -> BNormal(taskAffinity = io.test)-> SingleTask(taskAffinity = io.dove.offer) -> BNormal(taskAffinity = io.dove.offer)
    |-----------------------|
    |                       |
    |          BNormal      |
    |                       |
    |-----------------------|
    |      SingleTask       |
    |       (onCreate)      |
    |                       |
    |-----------------------|    |-----------------------|
    |                       |    |                       |
    |          ANormal      |    |          BNormal      |
    |                       |    |                       |
    |-----------------------|    |-----------------------|
    |                       |    |      SingleTask2      |
    |           Main        |    |       (onCreate)      |
    |        io.dove.offer  |    |       io.test         |
    |-----------------------|    |-----------------------|
    
      
    Main -> ANormal -> SingleTask2(taskAffinity = io.test,onCreate) -> BNormal(taskAffinity = io.test) -> SingleTask(taskAffinity = io.dove.offer) -> BNormal(taskAffinity = io.dove.offer) -> SingleTask2(taskAffinity = io.test,onNewIntent)
    |-----------------------|
    |                       |
    |          BNormal      |
    |                       |
    |-----------------------|
    |      SingleTask       |
    |       (onCreate)      |
    |                       |
    |-----------------------|
    |                       |
    |          ANormal      |
    |                       |
    |-----------------------|    |-----------------------|
    |                       |    |      SingleTask2      |
    |           Main        |    |       (onNewIntent)   |
    |        io.dove.offer  |    |       io.test         |
    |-----------------------|    |-----------------------|
    
    
    此时返回,SingleTask2 -> BNormal -> SingleTask -> ANormal -> Main
    
    • 配合 allowTaskReparenting = true 使用

      9.0 以上不适用,重排逻辑触发不确定

      8.0 以下可以

      ANormal(App A) -> BNormal(AppB)
      
      
      |-----------------------|
      |                       |
      |          BNormal      |
      |                       |
      |-----------------------|
      |                       |
      |          ANormal      |
      |                       |
      |-----------------------|  
      
      打开 AppB
      								   |-----------------------|  
      								   |                       |  
      								   |          BNormal      |  
      								   |                       |   
      |-----------------------|		|-----------------------|
      |                       |		|                       |
      |          ANormal      |		|          BMain        |
      |                       |		|                       |
      |-----------------------|		|-----------------------|  
      
    • 配合 Intent.FLAG_ACTIVITY_NEW_TASK 使用,和 SingleTask 效果一样,会创建新的栈