Activity生命周期以及启动模式对生命周期的影响
前天用户体验反馈的一个需求,要求每次进入应用都定位到首页;这个操作很明显不适合放在首页Activity(启动模式为SingleTask)的onResume中,如果对Activity的启动模式和生命周期熟悉,那么很容易想到在onNewIntent里操作就可以了,这样在应用内跳转不至于每次都定位到首页.
可见,对Activity生命周期和启动模式进行一下梳理很有必要.下面主要描述一下Activty的生命周期,以及launchMode对生命周期的影响,onNewIntent,onSaveInstanceState,onRestoreInstanceState方法何时调用.
Activity生命周期图
下面对上图Activity的生命周期进行一下描述
1,启动Activity,系统会先调用onCreate方法,然后调用onStart方法,然后调用onResume方法,此时Activity处于运行状态,此时用户可以看到该Activity对应的界面,界面可以与用户进行交互。
2,当Activity处于onResume状态时,Activity被其他界面未全部覆盖,例如弹出Dialog等,此时系统会调用onPause方法,暂停该Activity,将焦点交给弹出的Dialog,此时用户可以看到部分Activity,有一部分被Dialog遮挡,Activity不可以与用户交互,因为焦点在Dialog上。
3,当Activity处于2状态时,此时取消Dialog,让Activty全部可见,此时系统会调用onResume,让Activity重新获取焦点,重新回到运行状态。
4,当Activity处于onPause状态时,如果此时Activity被全部遮盖,或者退到后台。例如弹出一个全屏的界面将Activity全部遮盖,或者按power按键灭屏,那么系统会调用onStop方法。
5,当Activity处于onResume状态时,如果Activity被全部遮盖或者退到后台,例如按Home按键,按Power按键,或者弹出其他全屏Activity,那么系统会调用onPause,然后调用onStop。
6,当Activity处于onStop状态,也就是在后台的状态,重启启动该Activity,例如从多任务启动,从桌面启动,系统会先先调用onRestart,再调用onStart,再调用onResume,让Activity重新回到运行状态
7,当Activity处于onResume状态时,用户结束当前Activity,例如点击返回键,或者调用finish方法,那么系统先调用onPause,再调用onStop,再调用onDestroy。
8,如果Activity处于后台,也就是onStop状态,那么当Activty被回收,被强制结束时,不会执行onDestory,该Activty会被直接停止掉,再次点击启动时,会重新执行对应的生命周期方法。
9,当Activty处于onResume状态时,Activity被重新状态,例如旋转屏幕,调用recreate方法,系统会先调用onPause,再调用onStop,然后调用onDestroy,该Activty被关闭,系统会立刻重新启动该Activty,调用onCreate,再调用onStart,再调用onResume。
10,当Activty处于onStop状态,也就是在后台,此时切换系统设置,例如字体,语言等。此时Activty不会执行生命周期方法,当再次启动Activty时,会先调用onDestroy,然后重新启动Activty 先调用onCreate,再调用onStart,再调用onResume。
Activity的启动模式 即android:launchMode
Activity有四种启动模式,分别为standard,singleTop,singleTask,singleInstance。该属性在AndroidManifest.xml 中设置。
- <activity
- android:name=".MainActivity"
- android:label="@string/app_name"
- android:launchMode="singleInstance">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
1,standard
该模式为默认的模式,即如果Activity标签没有设置android:lanuchMode,那么launchMode就为standard。在该模式下,每次启动Activity都会创建一个新的实例对象,该模式下允许同一个Activity的不同实例同时存在。
如下图:
第一次启动Activty1,那么会创建一个Task,将Activty1放到Task中,如果在Activty1中,再次启动Activty1,那么会重新创建一个Activty1的实例添加到Task中,如果再启动Activty1,那么再重新创建一个Activity1的实例,再次添加到Task中,此时Task中有三个Activty1的实例对象,点击返回,Activty1的三个实例会一个一个的出栈。
2,singleTop
该启动模式,同一个Activity可以有多个不同的实例对象。当启动Activity时,如果栈顶的Activity是该Activity的一个实例,那么就不会重新创建一个Activity的实例,而是会重新使用栈顶的该Activity的实例对象,此时栈顶的Activity实例会调onNewIntent方法。如果栈顶的Activity实例不是该Activity的实例对象,那么就会重新创建一个Activity的实例对象,将该实例对象添加Task中。
如下图:
启动Activity1,此时会创建一个Task,将Activity1添加到Task中。此时如果再启动Activity1,由于Task顶部的Activity实例就是Activity1的实例,那么不会重新创建Activity1的实例,而是会复用Task顶部的Activty1。如果此时启动Activity2,由于Task顶部的实例为Activity1的实例,同时Task中也没有Activity2的实例,那么会重新创建一个Activity2的实例,将Activity2的实例添加到Task中。此时Task顶部的Activity实例为Activity2。如果再次启动Activity2,由于栈顶的Activity实例就是Activity2的实例,那么不会重新创建Activity2的实例,而是复用Task顶部的Activity2的实例,该实例的onNewIntent方法会被调用。如果此时启动Activity1,由于栈顶的Activity实例为Activity2的实例,那么会重新创建一个Activity1的实例,将该实例添加到Task中。这时Task中Activity1的实例有两个,Activity2的实例有一个。
3.singleTask
该模式下Activity的实例只有一个,在同一个程序内启动该Activity时,如果Task中没有该Activity的实例对象,那么会创建一个新的Activity对象,将对象添加到Task中,若Task中存在该Activity的实例,那么销毁掉在该Activity实例上的所有实例,上该Activity实例成为栈顶的实例,该实例的onNewIntent方法会被调用。
如下图:
启动Activity1,此时会创建一个Activity1的实例,并且添加到Task中,启动Activity2,会创建一个Activty2的实例,并且添加到Task中,启动Activty3,会创建一个Activity3的实例,并将该实例添加到Task中,此时Task中有三个Activity实例。Task顶部的为Activity3的实例,此时如果启动Activity2,由于Task中有Activity2的实例,那么Activity2实例上方的所有实例(Activity3)都会被销毁,此时Activity2成为Task顶部的实例。如果再未启动Activity2时,启动Activity1,由于Task中有Activity1的实例,那么Activity1实例上方的实例都会被销毁,Activity1会成为Task顶部的实例,并且onNewIntent会被调用。
4,singleInstance
该模式下,Activity的实例只有一个,并且运行在一个独立的Task中,该Task中不会有其他Activity的实例。
如下图:
启动Activity1,创建一个Activity1的实例,并且添加到Task中,此时启动Activity2,Activity2的lanuchMode为singleInstance,那么会创建一个新的Task,将Activity2的实例放到新的Task中。此时启动Activity3,Activity3的lanuchMode为非singleInstance,那么会将Activity3的实例添加到与Activity1相同的Task中。如果Activity3的lanuchMode也为singleInstance,那么会重新创建一个新的Task,将Activity3的实例放到新的Task中。如下图:
启动模式对Activity生命周期的影响
可以理解成启动模式不会影响Activity的正常的生命周期,一般只会是涉及到onNewIntent方法的调用,不设置android:lanuchMode或者lanuchMode为standard,那么onNewIntent肯定不会被调用,其他三种模式,可能会调用onNewIntent方法,不是一定被调用。singleTop模式,只要栈顶是要启动的Activity实例,那么onNewIntent就会被调用。singleTask,singleInstance,如果在同一个Task总有对应的Activity实例,那么onNewIntent会被调用。
onSaveInstanceState与onRestoreInstanceState方法的调用
onSaveInstanceState主要是用于保存一些临时数据,当Activity恢复时,可以恢复对应的数据,onRestoreInstanceState当Activity被重新创建时调用,可以从该 方法中恢复一些之前保存过的数据。
onSaveInstanceState一般是在Activity被“打断”的情况下被调用,例如被覆盖,包括全覆盖或者部分覆盖,或者按home退到后台,或者灭屏。另外一种情况就是Activity被重新创建会调用,例如用户在当前Activity旋转屏幕,或者用户调用recreate方法。点击返回键该方法不会被调用。onSaveInstanceState的调用顺序是在onPause之后,onStop之前。
onRestoreInstanceState一般是在Activty被重新创建恢复时会被调用,例如用户切换横竖屏。用户将Activty挂后台,切换系统设置,然后再启动该Activity。
Activity生命周期以及启动模式对生命周期的影响的更多相关文章
- Activity生命周期以及启动模式对生命周期的影响(二)
前面一篇文章概述了Android四大组件之一的Activity生命周期方法的调用先后顺序,但对于非标准启动模式下Activity被多次调用时的一些生命周期方法并未详细阐述,现在针对该情况着重记录. 现 ...
- Android开发艺术探索(一)——Activity的生命周期和启动模式
Activity的生命周期和启动模式 生命周期有? 1.典型情况下的生命周期—>指有用户参与的情况下,Activity所经过的生命周期改变 2.异常情况下的生命周期—>指Activity被 ...
- 《Android开发艺术探索》读书笔记 (1) 第1章 Activity的生命周期和启动模式
第1章 Activity的生命周期和启动模式 1.1 Activity生命周期全面分析 1.1.1 典型情况下生命周期分析(1)一般情况下,当当前Activity从不可见重新变为可见状态时,onRes ...
- Activity的生命周期和启动模式
Activity的生命周期分析 典型情况下的生命周期.是指在用户参与的情况下,Activity所经过的生命周期的改变. 异常情况下的生命周期.是指Activity被系统回收或者由于当前设备的Confi ...
- Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式
Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...
- Android Activity生命周期及启动模式
曾经搞过许多东西,再熟练的东西一段时间没有碰都会生疏或忘记.后来体会到写成文档记录下来的重要性,但有些word或ppt记录下来的东西随着时间流逝会丢失,或者不愿去看.或许保存成博客的形式,会是更好的选 ...
- Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。
原文:Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式. Android Activity 的四种启动模 ...
- Android零基础入门第77节:Activity任务栈和启动模式
通过前面的学习,Activity的基本使用都已掌握,接下来一起来学习更高级的一些内容. Android采用任务栈(Task)的方式来管理Activity的实例.当启动一个应用时,Android就会为之 ...
- Activity的四种启动模式和onNewIntent()
转自:http://blog.csdn.net/linghu_java/article/details/17266603 Android中Activity启动模式详解 在Android中每个界面都 ...
随机推荐
- Telnet操作memcached
telnet登录 #telnet <ip> [root@c1 ~]# telnet Trying 127.0.0.1... Connected to 127.0.0.1. Escape c ...
- 设计模式-迭代器模式(Iterator Pattern)
本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 迭代器模式简介 迭代器相信大部分人都不陌生,java/c++等很多编程语言的容器类都支持迭代器操 ...
- Python生成随机数的一些函数
头文件: import random 1.生成一个随机浮点数,范围是0-1: print random.random() 2.生成指定范围内的随机浮点数: print random.uniform(a ...
- 计蒜客NOIP2018模拟1
https://www.jisuanke.com/contest/1152 T1:最失败的一道题,其实就是道水题,好几种写法,一种都没想出来. 题意转化后就是:每个数可以选a[i]和a[i]-k,最后 ...
- 【最小生成树】【kruscal】【贪心】CDOJ1636 梦后楼台高锁,酒醒帘幕低垂
首先,考虑到,我们需要找到一条路径,使它的最小边尽量大,最大边尽量小 然后,考虑到m比较小,我们可以去寻找一个m^2或者m^2logm的算法 考虑枚举最小边,那么我们就需要在m或者mlogm的时间内找 ...
- Springcloud中的region和zone的使用
一.背景 用户量比较大或者用户地理位置分布范围很广的项目,一般都会有多个机房.这个时候如果上线springCloud服务的话,我们希望一个机房内的服务优先调用同一个机房内的服务 ,当同一个机房的服务不 ...
- mac下使用github 上传代码
提起github相信大家都不会陌生,在这里就不再赘述了.作为开源代码库以及版本控制系统,使用好了确实会非常受益,再说的势利点,你找工作时给面试官说你经常维护自己的技术博客和github,相信你给他的印 ...
- nginx 域名跳转 Nginx跳转自动到带www域名规则配置、nginx多域名向主域名跳转
nginx 域名跳转 Nginx跳转自动到www域名规则配置,如果设置使 mgcrazy.com域名在用户访问的时候自动跳转到 www.mgcrazy.com呢?在网上找了好多资料都没有一个完整能解决 ...
- VC知识库
VC知识库http://www.vckbase.com/index.php/code
- UltraISO(软碟通)制作安装Ubuntu系统的U盘安装盘
1.开UltraISO(软碟通),加载要写入U盘的iso文件,注意,要求软碟通的版本是9.3以上的.如下图: 2.点击“启动光盘.写入硬盘映像: 3.开启个写入硬盘映像的窗口,硬盘驱动器那一项看清楚是 ...