前天用户体验反馈的一个需求,要求每次进入应用都定位到首页;这个操作很明显不适合放在首页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 中设置。

  1. <activity
  2. android:name=".MainActivity"
  3. android:label="@string/app_name"
  4. android:launchMode="singleInstance">
  5. <intent-filter>
  6. <action android:name="android.intent.action.MAIN" />
  7. <category android:name="android.intent.category.LAUNCHER" />
  8. </intent-filter>
  9. </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生命周期以及启动模式对生命周期的影响的更多相关文章

  1. Activity生命周期以及启动模式对生命周期的影响(二)

    前面一篇文章概述了Android四大组件之一的Activity生命周期方法的调用先后顺序,但对于非标准启动模式下Activity被多次调用时的一些生命周期方法并未详细阐述,现在针对该情况着重记录. 现 ...

  2. Android开发艺术探索(一)——Activity的生命周期和启动模式

    Activity的生命周期和启动模式 生命周期有? 1.典型情况下的生命周期—>指有用户参与的情况下,Activity所经过的生命周期改变 2.异常情况下的生命周期—>指Activity被 ...

  3. 《Android开发艺术探索》读书笔记 (1) 第1章 Activity的生命周期和启动模式

    第1章 Activity的生命周期和启动模式 1.1 Activity生命周期全面分析 1.1.1 典型情况下生命周期分析(1)一般情况下,当当前Activity从不可见重新变为可见状态时,onRes ...

  4. Activity的生命周期和启动模式

    Activity的生命周期分析 典型情况下的生命周期.是指在用户参与的情况下,Activity所经过的生命周期的改变. 异常情况下的生命周期.是指Activity被系统回收或者由于当前设备的Confi ...

  5. Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式

    Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...

  6. Android Activity生命周期及启动模式

    曾经搞过许多东西,再熟练的东西一段时间没有碰都会生疏或忘记.后来体会到写成文档记录下来的重要性,但有些word或ppt记录下来的东西随着时间流逝会丢失,或者不愿去看.或许保存成博客的形式,会是更好的选 ...

  7. Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。

    原文:Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式. Android Activity 的四种启动模 ...

  8. Android零基础入门第77节:Activity任务栈和启动模式

    通过前面的学习,Activity的基本使用都已掌握,接下来一起来学习更高级的一些内容. Android采用任务栈(Task)的方式来管理Activity的实例.当启动一个应用时,Android就会为之 ...

  9. Activity的四种启动模式和onNewIntent()

    转自:http://blog.csdn.net/linghu_java/article/details/17266603 Android中Activity启动模式详解   在Android中每个界面都 ...

随机推荐

  1. HDU 1002.A + B Problem II-数组模拟-大数相加

    A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  2. 渗透脚本快速生成工具Intersect

    渗透脚本快速生成工具Intersect   当渗透人员获取目标系统的执行权限,往往需要编写相应的脚本,实现更多的渗透操作.Kali Linux提供一款Python脚本快速生成工具Intersect.该 ...

  3. SD 一轮集训 day4 弦形袋鼠

    可以发现把每一个 a[i] * b[i] 加到矩阵里去,就相当于 把一个 1*m 的向量伸缩后变成 n个再加到矩阵里去,所以答案就是远=原矩阵中线性线性无关组的个数. (而且好像一个矩阵横着消元和竖着 ...

  4. [BZOJ3131] [Sdoi2013]淘金

    [BZOJ3131] [Sdoi2013]淘金 Description 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐 ...

  5. HDU 6040 Hints of sd0061(划分高低位查找)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6040 [题目大意] 给出一个随机数生成器,有m个询问,问第bi小的元素是啥 询问中对于bi< ...

  6. windows下wnmp配置

    windows下面apache结合laravel会出现env文件公用的问题,太麻烦,就换用nginx.问题:https://github.com/vlucas/phpdotenv/issues/219 ...

  7. Java编程思想学习(二)----一切都是对象

    2.1用应用操作对象 String s; 这里所创建的只是引用,并不是对象.如果此时向s发送一个消息,就会返回一个运行时错误.这是因为此时s没有和任何事物关联.因此,一种安全的做法是:创建一个引用的同 ...

  8. 8VC Venture Cup 2016 - Elimination Round B. Cards 瞎搞

    B. Cards 题目连接: http://www.codeforces.com/contest/626/problem/B Description Catherine has a deck of n ...

  9. Word中正文两栏表格通栏排版

    如图所示,需要在插入表格的地方插入连续分节符,这是word2013,在插入里面只有分页符 如果直接插入的话表格上下的分节符会分栏,那样表格会歪曲, 可以上面一段和下面一段设置成通栏,然后中间插入表格, ...

  10. eval命令的使用

    eval :     将参数组合为一个新的命令,然后交给Shell执行.读取一连串的参数,并依参数本身的内容来执行命令.常用来处理Shell脚本中的变量,参数不限数目,参数用分号";&quo ...