1、生命周期
基本方法介绍:
方法 | 介绍 |
---|---|
onCreate | Activity创建,完成初始化操作 |
onRestart | 当活动有停止状态变为运行状态时调用 |
onstart | Activity可见,但是不能进行交互 |
onResume | Activity有焦点,已经在前台活动 |
onPause | Activity失去焦点,退出前台活动,可以做存储数据、停止动画 等操作 |
onStop | Activity不可见,可以做轻微重量级操作 ,如取消网络连接、注销广播接收器等 |
onDestrory | Activity被销毁,做回收工作、资源释放 |
onNewIntent | 已存在实例,回到栈顶位置,SingleTask、SingleTop、SingleInstance模式下都可能会调用,生命周期在onPause回到onPause之前、onStop回到onStart之间 |
可以看出Activity的完整生命周期是onCreate -> onStart -> onResume -> onPause -> onStop,onDestroy
2、Activity的四个状态
运行状态:当一个Activity位于返回栈的栈顶时,最不会被系统回收的状态
暂停状态:当一个Activity不再处理栈顶位置,但仍然可见,当Activity被另一个透明或者Dialog样式的Activity覆盖时都会导致前一个Activity处于Pause状态,系统不会轻易回收的状态
,除非是(内存极低的情况回收可见活动造成极不好的用户体验)
停止状态:不在栈顶位置,且不可见。当内存低的时系统会回收
销毁状态:不在栈中,系统会自动回收
优先级顺序:运行状态>暂停状态>停止状态>销毁状态
3、启动模式
1 Standard模式
安卓默认启动模式,这种模式下Activity可以有多个实例,无论任务栈是否已经有这个实例,系统都会创建一个新的Activity实例
- 启动A Acivity:onCreate-A -> onStart-A -> onResume-A
- 从A 跳转B:onPause-A -> onCreate-B -> onStart-B -> onResume-B -> onStop-A
- 从B回退到A:onPause-B -> onRestart-A -> onStart-A -> onResume-A -> onStop-B -> onDestroy-B (A启动A过程相同)
- home或者锁屏:onPause-A -> onStop-A
- home回到APP:onRestart-A -> onStart-A -> onResunme-A
- 直接kill掉进程:没有任何回调
2 SingleTask模式(栈内复用模式)
同一个Task内只有一个实例,如果Activity已经位于栈顶,系统不会创建新的Activity实例,和singleTop模式一样。但Activity已经存在但不位于栈顶时,就会将该Activity移到栈顶,并将它上面的Activity出栈
使用场景:浏览器、程序入口点
在栈顶的情况:
A启动A:onPause -> onNewIntent -> onResume
不在栈顶的情况:
A->B,从B启动A:onPause-B -> onNewIntent-A -> onRestart-A -> onStart-A -> onResume-A -> onStop-B -> onDestroy-B
A->B->C,从C启动A:onDestroy-B -> onPause-C -> onNewIntent-A -> onRestart-A -> onStart-A -> onResume-A -> onStop-C- > onDestroy-C
3 SingleTop模式(栈顶复用模式)
SingleTop模式与Standard模式很相似,主要区别是如果在栈顶,再去启动它时,不会创建新的实例,如果不位于栈顶,就会创建新实例
使用场景:搜索结果页
在栈顶的情况下:
A启动A:onPause -> onNewIntent -> onResume
不在栈顶的情况:
A->B,从B启动A:onPause-B -> onCreate-A -> onStart-A -> onResume-A -> onStop-B
A->B->C,从C启动A:onPause-C -> onCreate-A -> onStart-A -> onResume-A -> onStop-C
4 SingleInstance模式(单例模式)
singleInstance模式也是单例的,但和singleTask不同,singleTask只是任务栈内单例,系统里是可以有多个singleTask Activity实例的,而singleInstance Activity在整个系统里只有一个实例,启动一singleInstanceActivity时,系统会创建一个新的任务栈,并且这个任务栈只有他一个Activity。
生命周期和SingleTop大体一样
SingleInstance模式并不常用,启动时会慢一些,切换效果不好,影响用户体验。
使用场景:闹铃的响铃页面
闹钟界面,你以前设置了一个闹铃:上午6点。在上午5点58分,你启动了闹铃设置界面,并按Home键回桌面;在上午5点59分时,你在微信和朋友聊天;在6点时,闹铃响了,并且弹出了一个对话框形式的Activity(名为AlarmAlertActivity)提示你到6点了(这个Activity就是以SingleInstance加载模式打开的),你按返回键,回到的是微信的聊天界面,这是因为AlarmAlertActivity所在的Task的栈只有他一个元素,因此退出之后这个Task的栈空了。如果是以SingleTask打开AlarmAlertActivity,那么当闹铃响了的时候,按返回键应该进入闹铃设置界面。
4、onSaveInstanceState和onRestoreInstanceState
出现时机
:Activity被异常销毁的时候会调用onSavaInstanceState方法,重建时会调用onRestoreInstanceState来获取已保存的数据,也可以通过onCreate 获取。
发生场景
:资源相关的系统配置发生改变、内部不足、开启不保留活动等等。
例子:
开启不保留活动,跳到另一个Activity时:
onPause -> onSaveInstanceState -> onStop -> onDestroy
回到上一个Activity时:
onCreate -> onStart -> onRestoreInstanceState -> onResume