![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190606104746.png)
[TOC]
# Activity 的生命周期
![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190608094149.png)
## 正常情况下
正常情况下就是从 onCreate 开始,从onDestroy 结束。
## 异常情况下
[Android开发之InstanceState详解](https://www.cnblogs.com/hanyonglu/archive/2012/03/28/2420515.html)
触发的常见两个原因:
1. 系统内存不足杀死 Activity
2. 系统配置发生变化杀死 Activity
异常情况下会调用下面的两个方法:
![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190608094632.png)
**在Activity 异常销毁的时候我们可以在 onSaveInstanceState 方法里面去存储一些数据,**
**在Activity 重新创建的时候,我们可以在 onRestoreInstanceState 方法(或者 onCreate)里面去恢复一些数据**
使用 onCreate 和 onRestoreInstanceState 方法恢复数据的区别:
onCreate :可能为空(正常创建的时候是空的,异常销毁再重新创建的时候可能为空)
onRestoreInstanceState: Bundle 不可能为空
分场景
两个 Activity A 和 B
### 场景 1 A 正常启动 B
A 的 onPause --> B 的 onCreate --> onStart --> onResume --> A 的 onStop
### 场景 2 B 返回 A
B 的 onPause --> A 的 onRestart --> onStart --> onResume--> B 的 onStop --> onDestroy
### 场景 3 A 在栈顶,使用 SingleTop 启动 A
A 的 onPause --> onNewIntent --> onResume
### 场景 4 A 异常情况下生命周期
onPause --> onStop -->onSaveInstanceState -->onDestroy -->onCreate-->onStart
--> onRestoreInstanceState -->onResume:
# 四种启动模式
## 1. 为什么要有启动模式?
因为在`Android`中,启动一个`Activity`有时需要创建一个新的对象,有时需要复用已有的对象。
### standard:标准模式、默认模式
**含义**:每次启动一个`Activity`就会创建一个新的实例。
**注意**:使用`ApplicationContext`去启动`standard`模式`Activity`就会报错。因为`standard`模式的`Activity`会默认进入启动它所属的任务栈,但是由于非`Activity`的`Context`没有所谓的任务栈。
**生命周期**:每次被创建的实例`Activity` 的生命周期符合典型情况,它的`onCreate、onStart、onResume`都会被调用。
**应用场景**:应用与大多数的`Activity`。一般我们 `app` 中大部分页面都是由该模式的页面构成的,比较常见的场景是:社交应用中,点击查看用户 A 信息 -> 查看用户 A 粉丝 -> 在粉丝中挑选查看用户 B 信息 -> 查看用户 A 粉丝... 这种情况下一般我们需要保留用户操作 `Activity` 栈的页面所有执行顺序。
![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190608111254.png)
### singleTop:栈顶复用模式
**含义**:分两种处理情况:需要创建的`Activity`已经处于栈顶时,此时会直接复用栈顶的`Activity`。不会再创建新的`Activity`;若须要创建的`Activity`不处于栈顶,此时会又一次创建一个新的`Activity`入栈,同`Standard`模式一样。
**生命周期**:若情况一中栈顶的`Activity`被直接复用时,它的`onCreate、onStart`不会被系统调用,由于它并没有发生改变。可是一个新的方法 `onNewIntent`会被回调(`Activity`被正常创建时不会回调此方法)。
**应用场景**:假设你在当前的`Activity`中又要启动同类型的`Activity`,此时建议将此类型`Activity`的启动模式指定为`SingleTop`,能够降低`Activity`的创建,节省内存!一般常见于社交应用中的通知栏行为功能,例如:`App` 用户收到几条好友请求的推送消息,需要用户点击推送通知进入到请求者个人信息页,将信息页设置为 `SingleTop` 模式就可以增强复用性。
![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190608111752.png)
### singleTask:栈内复用模式
**含义**:若须要创建的`Activity`已经处于栈中时,此时不会创建新的`Activity`,而是将存在栈中的`Activity`上面的其他`Activity`所有销毁,使它成为栈顶。
**生命周期**:同`SingleTop` 模式中的情况一同样。仅仅会又一次回调`Activity`中的 `onNewIntent`方法
**应用场景**:保持我们应用开启后仅仅有一个`Activity`的实例。最典型的样例就是应用中展示的主页(`Home`页),假设用户在主页跳转到其他页面,运行多次操作后想返回到主页。
![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190608112136.png)
#### 例外
**如果设置了 taskAffinity ,如果 taskAffinity 和主的任务栈相同,则在原来任务栈中启动,如果不同,则启动一个新的任务栈。**
### singleInstance:全局单例模式
**含义**:是全局单例模式,是一种加强的`SingleTask`模式。它除了具有它所有特性外,还加强了一点:具有此模式的`Activity`仅仅能单独位于一个任务栈中。
**应用场景**:这个经常使用于系统中的应用,比如`Launch`、锁屏键的应用等等,整个系统中仅仅有一个!所以在我们的应用中一般不会用到。常应用于独立栈操作的应用,如闹钟的提醒页面,当你在 A 应用中看视频时,闹钟响了,你点击闹钟提醒通知后进入提醒详情页面,然后点击返回就再次回到 A 的视频页面,这样就不会过多干扰到用户先前的操作了。
![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190608112638.png)
![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190606104746.png)
- Java 面试题
- String、StringBuffer、StringBuilder 的区别?
- Java 中的四种引用
- 接口和抽象类的本质区别
- 集合框架
- 集合概述
- ArrayList 源码分析
- LinkedList 源码分析
- HashMap 源码分析
- LinkedHashMap 源码分析
- Android提供的 LruCache 的分析
- LinkedList 和 ArrayList 的区别
- 多线程
- 实现多线程的几种方式
- 线程的几种状态
- Thread 的 start() 和 run() 的区别
- sleep() 、yield() 和 wait() 的区别 ?
- notify() 和 notifyAll() 的区别?
- 保证线程安全的方式有哪几种?
- Synchronized 关键字
- volatile 和 synchronized 的区别?
- 如何正确的终止一个线程?
- ThreadLocal 原理分析
- 线程池
- 多线程的三个特征
- 五种线程池,四种拒绝策略,三种阻塞队列
- 给定三个线程如何顺序执行完以后在主线程拿到执行结果
- Java 内存模型
- 判定可回收对象算法
- equals 与 == 操作符
- 类加载机制
- 类加载简单例子
- 算法
- 时间、空间复杂度
- 冒泡排序
- 快速排序
- 链表反转
- IO
- 泛型
- Kolin 面试题
- Android 面试题
- Handler 线程间通信
- Message、MessageQueue、Looper、Handler 的对象关系
- Handler 使用
- Handler 源码分析
- HandlerThread
- AsyncTask
- IntentService
- 三方框架
- Rxjava
- rxjava 操作符有哪些
- 如何解决 RxJava 内存泄漏
- Rxjava 线程切换原理
- map和 flatmap 的区别
- Databinding引起的 java方法大于 65535 的问题
- Glide
- Glide 的缓存原理
- Glide 是如何和生命周期绑定的?不同的Context 有什么区别?
- Glide 、Picasso 、的区别,优劣势,如何选择?
- Jetpack
- 源码分析
- EventBus
- EventBus 源码分析
- RxBus 替代 EventBus
- OkHttp
- OkHttp 源码分析
- OkHttp 缓存分析
- RxPermission
- RxPermission 源码分析
- Retrofit
- create
- Retrofit 源码分析
- 优化
- 启动优化
- 布局优化
- 绘制优化
- 内存优化
- 屏幕适配
- 组件
- Activity
- Frgment
- Service
- ContentProvider
- BroadcastReceiver
- 进程间通信
- Binder机制和AIDL
- AILD 中的接口和普通的接口有什么区别
- in、out、inout 的区别
- Binder 为什么只需要拷贝一次
- 在android中,请简述jni的调用过程
- 生命周期
- Activity 生命周期
- Fragment 生命周期
- Service 生命周期
- onSaveInstanceState() 与 onRestoreIntanceState()
- 前沿技术
- 组件化
- 模块化
- 插件化
- 热更新
- UI - View
- Android 动画
- 事件分发机制
- WebView
- 系统相关
- 谈谈对 Context 的理解
- Android 版本
- App应用启动流程
- App 的打包
- App 的加固
- App 的安装
- Activity 启动流程
- ClassLoader
- Lru 算法加载 Bitmap 三级缓存原理
- Parcelable 和 Serializable 的区别
- Activity的启动流程
- 相关概念
- 网络相关
- Http
- Https
- Http 和 Https 的区别
- 为什么要进行三次握手和四次挥手?
- OkHttp使用Https访问服务器时信任所有证书
- 设计模式
- 单例模式
- 构建者模式
- 工厂模式
- 外观模式
- 代理模式