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 中设置。

  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。

时间: 2024-10-05 04:40:36

Activity生命周期以及启动模式对生命周期的影响的相关文章

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

前面一篇文章概述了Android四大组件之一的Activity生命周期方法的调用先后顺序,但对于非标准启动模式下Activity被多次调用时的一些生命周期方法并未详细阐述,现在针对该情况着重记录. 现象 发布会demo中出现了这样的一种现象:当界面即将出现时,语音重复唤起该界面时,由于在onPause中调用了finish(),界面一直未显示出来,这不是我们想要的. 分析 由于系统组这边存在的一个bug,全屏的Activity出现时会带起在后台运行的应用界面,所以我们这边的Activity不得不采

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

Android开发艺术探索--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activity搬上来了,也确实,和Activity打交道的次数基本上是最多的,而且他的内容和知识点也是很多的,非常值得我们优先把他掌握,Activity中文翻译过来就是"活动"的意思,但是主席觉得这样翻译有些生硬,直接翻译成"界面"可能更好,的确,Activity主要也是用于UI效

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

Activity的生命周期和启动模式 生命周期有? 1.典型情况下的生命周期—>指有用户参与的情况下,Activity所经过的生命周期改变 2.异常情况下的生命周期—>指Activity被系统回收或者由于当前设备的configuration发生改变而导致Activity被销毁重建 1.1 典型生命周期分析 旧活动的OnPause先调用,新Activity才启动 异常分析: 1.资源相关的系统配置发生改变,导致Activity被杀死并重新创建 系统只在Activity导致终止的时候才会调用OnS

Activity生命周期和启动模式

Activity正常情况下的生命周期: 1.   一个Activity的正常启动: onCreate --> onStart --> onResume 2.   A(Activity)打开新的B(Activity)或者用户按住Home键切换到主界面,当前Activity所调用的方法:  onPause  -->  onStop 3.   此时在重新回到A(Activity)所调用的方法:  onRestart  -->  onStart  -->  onResume 4,  

Android Activity生命周期及启动模式

曾经搞过许多东西,再熟练的东西一段时间没有碰都会生疏或忘记.后来体会到写成文档记录下来的重要性,但有些word或ppt记录下来的东西随着时间流逝会丢失,或者不愿去看.或许保存成博客的形式,会是更好的选择,勉励自己. Activiy是Android开发中最常用最常见的组件,是Android开发人员开始学习首先接触的组件,也是大部分人建立一个工程后,首先要处理的可能就是Activity.这么重要.常用.简单.易上手的组件,牢固掌握其基础知识,对于开发人员是非常重要的.本文会首先解释其基本概念,对于其

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

Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags(); 一.Android Activity 四种启动模式 lunchMode 在Manifest 配置文件中的属性如下: (1) android:launchMode="standard" (2)android:launchMode="singleTop" (3)android:launchMode="singleTask" (4)andro

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

转自 http://blog.csdn.net/linghu_java/article/details/17266603 在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Android总Activity的启动模式分为四种: Activity启动模式设置: <activity android:name=".MainActivity" a

Android Activity:四种启动模式,Intent Flags和任务栈(转自他人博客)

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.那各个页面跳转关系如何决定呢?如果启动了顺序启动了ABCD的Activiy,如何从D调回到B呢?下面讲述一下Acitivity的四种启动模式.讲解启动模式之前,有必要先讲解一下“任务栈”的概念; 任务栈 每个应用都有至少一个任务栈,是用来存放Activity的,功能类似于函数调用的栈,先后顺序代表了Activity的出现顺序:比如Activity1-->Activity2-->Act

Android Activity的4种启动模式详解(示例)

转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5233269.html 先介绍下Android对Activity的管理,Android采用Task来管理多个Activity,当我们启动一个应用时,Android就会为之创建一个Task,然后启动这个应用的入口Activity(即<intent-filter.../>中配置为 MAIN和LAUNCHER的Activity). 因为Android并没有为Task提供API,因此我们无法真正去访问Task,只