# Android Activity

By [baiyanwu.eth](https://paragraph.com/@baiyanwu) · 2022-03-01

---

生命周期
----

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 效果一样，会创建新的栈**

---

*Originally published on [baiyanwu.eth](https://paragraph.com/@baiyanwu/android-activity)*
