Android查缺补漏--Activity生命周期和启动模式
一、生命周期
- onCreate():启动Activity时,首次创建Activity时回调。
- onRestart():再次启动Activity时回调。
- onStart():首次启动Activity时在onCreate()之后被回调,再次启动时在onRestart()之后被回调。此时Activity已经可见但还没出现到前台不能与用户交互。
- onResume():在onStart()之后被回调,此时Activity已经完全可见并且可以与用户交互。
- onPause():当用户返回或者跳转到下一个Activity时会回调此方法,表示正在停止当前Activity,但此时Activity依然可见,通常紧接着会回调onStop()。
- onStop():表示Activity即将停止。
- onDestroy():表示Activity被销毁。
值得注意的地方:
- onStart和onResume咋看起来差不多,但有一些细微的差别,onStart表示Activity虽然此时已经可见但并没有完全显示到前台,onResume表示此时已经完全显示到前台了,并可以与用户交互了,onPause和onStop区别类似于此。
- 当ActivityA启动ActivityB时,他们的生命周期方法执行顺序如下:
A.onPause->B.onCreate->B.onStart->B.onResume->A.onStop
日志如下:
12-05 17:18:24.666 778-778/cn.codingblock.androidadvancestudy I/MainActivity: onPause:
12-05 17:18:24.674 778-778/cn.codingblock.androidadvancestudy I/BActivity: onCreate:
12-05 17:18:24.687 778-778/cn.codingblock.androidadvancestudy I/BActivity: onStart:
12-05 17:18:24.688 778-778/cn.codingblock.androidadvancestudy I/BActivity: onResume:
12-05 17:18:25.006 778-778/cn.codingblock.androidadvancestudy I/MainActivity: onStop:
1、普通情况下的Activity生命周期方法执行顺序:
- 启动一个Activity:onCreate()->onStart()->onResume();
- 当在当前Activity中跳转到下一个页面时(或者被用户切换到后台时),当前的Activity会被暂停:onPause()->onStop();
- 然后再返回这个Activity时:onRestart()->onStart()->onResume();
- Activity退出时:onPause()->onStop()->onDestroy()。
2、横竖屏切换时Activity生命周期方法执行顺序:
- onPause()->onSaveInstanceState()->onStop()->onDestroy()->onCreate()->onStart()->onRestoreInstanceState()->onResume()。
在横竖屏切换时Activity会先被销毁,然后再重新创建,在销毁时onPause()被调用之后会调用onSaveInstanceState(Bundle bundle),此时我们就有机会将一些需要恢复的信息写入onSaveInstanceState()的Bundle参数中,在Activity被重建时,调用onStart()之后会调用onRestoreInstanceState(Bundle bundle),此时我们就可以在onRestoreInstanceState()用来恢复一些必要的信息,而它的参数就是我们在onSaveInstanceState写入的参数。
3、系统内存不足导致低优先级的Activity被回收时的生命周期方法执行顺序
此种情况和第二种横竖屏切换时的情况查不多,也会执行onSaveInstanceState()和onRestoreInstanceState()。
二、四种启动模式
- standard:默认的启动方式,Activity可以被多次实例化,即同一个栈中可以存在多个Activity实例。
如果用ApplicationContext去启动standard模式的Activity的时候会报错,这是因为此模式的Activity默认会进入启动它的Activity所属的任务栈中,而非Activity类型的Context并有没有任务栈。解决办法就是在用ApplicationContext启动Activity时指定FLAG_ACTIVITY_NEW_TASK即可,这样在启动Activity时就会为它创建一个新栈。
singleTop:栈顶复用模式。以singleTop模式启动的Activity如果已经有一个示例存在栈顶,那么再启动这个Activity时就会重用这个示例,并调用onNewIntent()方法。如果不在栈顶,则会创建新的示例,效果如standard一致。
singleTask:栈内复用模式。此模式只允许一个栈中只存在一个该Activity的实例,启动此模式的Activity时,如果栈中没有该Activity的实例,则会创建新的实例。如果栈中已经存在该实例了,系统会销毁在其之上的所有Activity,最终让该Activity实例置于栈顶,并回调onNewIntent()方法。
singleInstance:单实例模式。该模式的Activity只在一个独立的任务栈中开启,并且这个新的任务栈中有且只有这一个实例。当再次启动该Activity实例时,会重用已存在的任务和实例(并调用onNewIntent)。而该Activity启动的其他Activity会自动运行与另一个任务栈中。
singleInstance和singleTask的区别:
- singleInstance在同一个时刻,在系统中只会存在一个实例,而singleTask模式的Activity可以有多个实例,只要这些实例在不同的任务栈中即可。
- 比如应用A启动了一个singleInstance的Activity,而应用B也启动了这个Activity,那么会重用已经启动的实例。
最后想说的是,本系列文章为博主对Android知识进行再次梳理,查缺补漏的学习过程,一方面是对自己遗忘的东西加以复习重新掌握,另一方面相信在重新学习的过程中定会有巨大的新收获,如果你也有跟我同样的想法,不妨关注我一起学习,互相探讨,共同进步!
参考文献:
- 《Android开发艺术探索》
- 《Android开发进阶从小工到专家》
Android查缺补漏--Activity生命周期和启动模式的更多相关文章
- Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解
前言 大家好,给大家带来Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解的概述,希望你们喜欢 Activity是什么 作为一个Activ ...
- Activity生命周期以及启动模式对生命周期的影响
前天用户体验反馈的一个需求,要求每次进入应用都定位到首页;这个操作很明显不适合放在首页Activity(启动模式为SingleTask)的onResume中,如果对Activity的启动模式和生命周期 ...
- Android Activity生命周期及启动模式
曾经搞过许多东西,再熟练的东西一段时间没有碰都会生疏或忘记.后来体会到写成文档记录下来的重要性,但有些word或ppt记录下来的东西随着时间流逝会丢失,或者不愿去看.或许保存成博客的形式,会是更好的选 ...
- Activity生命周期以及启动模式对生命周期的影响(二)
前面一篇文章概述了Android四大组件之一的Activity生命周期方法的调用先后顺序,但对于非标准启动模式下Activity被多次调用时的一些生命周期方法并未详细阐述,现在针对该情况着重记录. 现 ...
- Android Activity生命周期与启动模式
Activity的完整生命周期如下图: Activity的加载模式有四种: standard: 标准模式,默认的加载模式,每次通过这种模式启动目标Acitivity,都创建一个新的实例,并将该Acti ...
- Android03-Activity生命周期及启动模式
1.返回栈概念 2.生命周期 1. onCreate() 这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动 第一次被创建的时候调用.你应该在这个方法中完成活动的初始化操作,比如 ...
- 关于activity生命周期,启动模式和tag
Acticity启动模式 1.standard:Activity的默认加载方法,该方法会通过跳转到一个新的activity,同时将该实例压入到栈中(不管该activity是否已经存在在Task栈中,都 ...
- Android查缺补漏(View篇)--自定义 View 的基本流程
View是Android很重要的一部分,常用的View有Button.TextView.EditView.ListView.GridView.各种layout等等,开发者通过对这些View的各种组合以 ...
- Android查缺补漏(View篇)--事件分发机制源码分析
在上一篇博文中分析了事件分发的流程及规则,本篇会从源码的角度更进一步理解事件分发机制的原理,如果对事件分发规则还不太清楚的童鞋,建议先看一下上一篇博文 <Android查缺补漏(View篇)-- ...
随机推荐
- RobotFramework自动化测试环境配置
现在工作是做自动化测试平台维护的,平台用的C#做的,主要是用来测试CMBRun项目,它是c/s结构的项目,而b/s结构的项目主要使用RF+Python来做.做这块之前听过自动化测试,身边的朋友也有做这 ...
- java多线程创建-Thread,Runnable,callable和threadpool
java创建多线程的方式有许多种,这里简要做个梳理 1. 继承Thread类 继承java.lang.Thread类,创建本地多线程的类,重载run()方法,调用Thread的方法启动线程.示例代码如 ...
- mysql 查询数据库内各表的占用大小
select TABLE_NAME, concat(truncate(data_length/1024/1024,2),' MB') as data_size, concat(truncate(ind ...
- Python 函数返回值
本章详细介绍 返回值: 0x 00 返回值简介 0x 01 指定返回值与隐含返回值 0x 02 return 语句位置与多条 return 语句 0x 03 返回值类型 0x 04 函数嵌套 0x 0 ...
- Redis 持久化之RDB和AOP
Redis 持久化之RDB和AOP Redis 有两种持久化方案,RDB (Redis DataBase)和 AOP (Append Only File).如果你先快速了解和使用RDB和AOP,可以直 ...
- Nuxt框架实践
前言 今天抽空过了遍nuxt文档,写了个实践demo,关于nuxt我已经断断续续看了好几遍了,自我感觉也算是入门了吧,从开发到上线心里都有底.后期打算在项目用起来的是nuxt框架,一些函数工具库,比如 ...
- C语言之成绩转换
#include<stdio.h>int main(){int score,grade;scanf("%d",&score);grade=score/10;sw ...
- ThinkPHP中处理验证码不显示问题
在调用验证码之前加上 ob_clean(); 不显示验证码的代码: public function verify(){ $Verify = new \Think\Verif ...
- cinder块存储 后端采用lvm、nfs安装配置
#cinder块存储 后端采用lvm.nfs安装配置 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html #cinder ...
- 中文编程语言之Z语言初尝试: ZLOGO 4
原文: https://zhuanlan.zhihu.com/p/31505895. 作者为本人. @TKT2016 开发的Z语言(ZLOGO是它的一个部分)是本人至今看到的唯一一个仍活跃开发的开源且 ...