Cover photo

Android Activity

生命周期

  1. 整体介绍

    # 完整流程
    onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy
    
    # 切到后台时不可见,缓慢切回
    onStop -> onRestart -> onStart -> ....
    
    # 暂停回来,两个 Activity 快速切回
    onPause -> onResume -> ...
    
    # 被杀死
    onStop -> killed -> onCreate -> ....
    
  2. 各个阶段

    • onCreate: 初始化

    • onStart: 已经可见,但是无法交互

    • onResume: 可见,且可以交互

    • onPause: 暂停,在前台并可见,可以进行暂存数据,不能太耗时

    • onStop: 不可见,无法交互,但还在内存中,未被销毁,进行资源回收

    • onDestroy: 不可见,Activity 进行销毁,进行资源回收

    • onRestart: 重新打开出发

  3. 几个问题

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

      • 初始化的动画是无效的

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

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

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

      • 官方推荐布局设置,view 绑定,放到 onCreate 中

    • 如果把所有的去初始化都在onStop()中实现,会有什么问题?

      • 在 onResume() 的注释中,建议是在onResume()中打开独占设备(比如相机),与onResume()对应的是onPause(),所以所有的去初始化操作放在**onStop()**中执行,可能会引出新的问题;

      • onStop() 的注释中明确地写了,在内存不足而导致系统无法保留此进程的情况下,onStop() 可能都不会被执行。

    • A -> B,会执行什么?

      A#onPause() -> B#onCreate -> B#onStart -> B#onResume -> A#onStop()

任务

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

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

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

  2. 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   |
    |                       |      |                       |
    |-----------------------|      |-----------------------|
    
  3. 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        |
     |                       |
     |-----------------------|
    
  4. 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)
    

二、 taskAffinity 属性

  1. taskAffinity 与 standard 模式配合无用

  2. 配合 SingleTask 使用

    整个跳转流程如下:

    Main(packagename=io.dove.offer) -> 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
    
  3. 配合 allowTaskReparenting 使用

    💡 9.0 以上不适用,重排逻辑触发不确定 8.0 以下可以

    ANormal(App A) -> BNormal(AppB)
    
    |-----------------------|
    |                       |
    |          BNormal      |
    |                       |
    |-----------------------|
    |                       |
    |          ANormal      |
    |                       |
    |-----------------------|  
    
    此时退回桌面,直接打开 AppB
                                                        |-----------------------|  
                                                        |                       |  
                                                        |          BNormal      |  
                                                          |                       |   
    |-----------------------|		|------------------|
    |                       |		|                       |
    |          ANormal      |		|          BMain        |
    |                       |		|                       |
    |-----------------------|		|-------------------
    
  4. 配合 Intent.FLAG_ACTIVITY_NEW_TASK 使用和 SingleTask 效果一样,会创建新的栈