Activity的启动模式

官网解释链接
(tips:在阅读此文章前,应先对Activity生命周期掌握)
在每一个程序的main目录下有一个AndroidManifest.xml文件,这个文件是用来配置Activity的,在配置Activity时可指定android:launchMode 属性,该属性用于配置该Activity的启动模式(或称加载模式)。
eg:AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.testapp1"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.TestApp1"><activity android:name=".activity.MainActivity" android:launchMode="singleTop" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".activity.NextActivity" /><activity android:name=".activity.PersonActivity" android:launchMode="singleTop" /></application></manifest>

android:launchMode 属性支持如下4个属性值:

  • standard:标准模式,这也是默认的加载模式。
  • singleTop:Task栈顶单列模式。
  • singleTask:Task内单列模式。
  • singleInstance:全局单列模式。

Activity的启动模式负责管理实例化、启动Activity的方式,并可以控制Activity与Task之间的加载关系。
Task可以理解为Activity栈,Task以栈的形式来管理Activity,并且先启动的Activity被放入栈底,后启动的Activity被置于栈顶。

standard模式以及对Activity生命周期的影响

启动Activity时,Android都会为目标Activity创建一个新的实例,并添加在当前的Task栈中。特点:一直启动新的Activity实例并且不会启动新的Task。
MainActivity部分代码:

findViewById(R.id.imageButton).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(view.getContext(), PersonActivity.class);view.getContext().startActivity(intent);}});

PersonActivity部分代码:

findViewById(R.id.imageView2).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(view.getContext(), MainActivity.class);view.getContext().startActivity(intent);}});

上面两段代码意思是在MainActivity中点击id为imageButton的按钮时,启动PersonActivity;在PersonActivity中点击id为imageView2的控件时,启动MainActivity。
在AndroidManifest.xml中设置MainActivity和PersonActivity的启动模式为standard:

<activity android:name=".activity.MainActivity" android:launchMode="standard" >
<activity android:name=".activity.PersonActivity" android:launchMode="standard" />

运行程序,进入MainActivity,点击按钮启动PersonActivity,进入PersonActivity,点击图片控件启动MainActivity,进入MainActivity,再次点击按钮启动PersonActivity观察其生命周期的变化:
MainActivity实例1:onCreate()->
MainActivity实例1:onStart()->
MainActivity实例1:onResume()->
此时点击按钮->
MainActivity实例1:onPause()->
PersonActivity()实例1:onCreate()->
PersonActivity实例1:onStart()->
PersonActivity实例1:onResume()->
MainActivity实例1:onStop()->
此时点击图片控件->
PersonActivity实例1:onPause()->
MainActivity实例2:onCreate()->
MainActivity实例2:onStart()->
MainActivity实例2:onResume()->
PersonActivity实例1:onStop()->
此时点击按钮->
MainActivity实例2:onPause()->
PersonActivity()实例2:onCreate()->
PersonActivity实例2:onStart()->
PersonActivity实例2:onResume()->
MainActivity实例2:onStop()

上述生命周期加粗处以及图片标记颜色处发现:在同一个Activity对的实例未销毁,却进行的是onCreate()而不是onRestart()。因此,在标准模式下,Activity创建了新的对象加入Task栈顶,原来的实例在Task栈内。(不同Activity实例的hashCode值有差异,但它们所在的TaskID总是相同的,表明标准模式不会使用新的Task)

singleTop模式以及对Activity生命周期的影响

singleTop模式与standard模式类似,不同点在于singleTop模式时,若需启动的目标Activity已经位于Task栈顶时,系统不会重新创建目标Activity的实例,而是复用已有位于栈顶Activity实例。
其对于Activity生命周期的影响与standard模式不同的时,当动的目标Activity已经位于Task栈顶时,不会onCreate(),而是onRestart()。其他情况与standard模式保持一致,在此不做详细叙述。

singleTask模式以及对Activity生命周期的影响

采用singleTask这种加载模式的Activity能保证在同一个Task内只有某个Activity的一个实例,当系统采用singleTask 模式启动目标Activity时,可分为如下三种情况:

  1. 如果将要启动的目标Activity不存在,系统将会创建目标Activity的实例,并将它加入Task栈顶。
  2. 如果将要启动的目标Activity已经位于Task栈顶,此时与singleTop模式的行为相同。
  3. 如果将要启动的目标Activity已经存在、但没有位于Task栈顶,系统将会把位于该Activity上面的所有Activity移出Task栈,从而使得目标Activity转入栈顶。

代码参考standard模式中贴的代码,其中将MainActivity与PersonActivity的启动模式设置为android:launchMode=“singleTask”
观察在singleTask模式下对Activity生命周期的影响:
MainActivity:onCreate()->
MainActivity:onStart()->
MainActivity:onResume()->
此时点击按钮->
MainActivity:onPause()->
PersonActivity():onCreate()->
PersonActivity:onStart()->
PersonActivity:onResume()->
MainActivity:onStop()->
此时点击图片控件->
PersonActivity:onPause()->
MainActivity:onRestart()->
MainActivity:onStart()->
MainActivity:onResume()->
PersonActivity:onStop()->

上述生命周期加粗处以及图片标记颜色处发现:启动目标Activity在Task栈中存在时,会直接启动已存在的Activity的实例复用,并且会销毁Task栈中在此Activity实例上的Activity实例。

singleInstance模式以及对Activity生命周期的影响

在singlelInstance这种启动(加载)模式下,系统保证无论从哪个Task中启动目标Activity,只会创建一个目标Activity实例,并会使用一个全新的Task 栈来加载该Activity实例。
当系统采用 singleInstance模式启动目标Activity时,可分为如下两种情况。

  • 如果将要启动的目标Activity不存在,系统会先创建一个全新的Task,再创建目标Activity的实例,并将它加入新的Task栈顶。
  • 如果将要启动的目标Activity已经存在,无论它位于哪个应用程序中、位于哪个Task中,系统都会把该Activity所在的Task转到前台,从而使该Activity显示出来。

需要指出的是,采用singleInstance模式加载Activity总是位于Task 栈顶,且采用singleInstance模式加载的Activity所在Task将只包含该Activity。
观察在singleInstance模式下对Activity生命周期的影响:

从图中可以看出,singleInstance模式下,启动MainActivity时,创建了Task,并将MainActivity的实例放入Task栈中(只有一个故位于栈顶);启动PersonActivity时,创建了新的Task,并将PersonActivity的实例放入新Task中(只有一个故位于栈顶),新Task位于前台,原Task置于后台;再启动MainActivity时,由于其之前已经存在,将其位于的原Task转入前台,因在栈顶,直接展示。

Android Activity的启动模式及对生命周期的影响相关推荐

  1. Activity为singleTask模式时的生命周期

    Activity为singleTask模式时的生命周期 Activity A:android:launchMode="singleTask" Activity B:launchMo ...

  2. android activity 切换屏幕方向时的生命周期

    1.不设置Activity的Android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 2.设置Activity的android:configCh ...

  3. Android入门(六) | Activity 的启动模式 及 生产环境中关于 Activity 的小技巧

    文章目录 Activity 的启动模式 standard singleTop singleTask singleInstance 技巧 了解当前界面是哪个 Activity 随时随地退出程序 启动活动 ...

  4. Android 源码分析 Activity的启动模式

    一直想抽空针对AMS进行源码分析,无奈一方面因为很忙,另外AMS很复杂,涉及的知识点也比较多,今天利用五一假期对AMS的一个方面,Activity的启动模式进行源码分析,这里面包括了ActivityR ...

  5. Android中Activity的启动模式和使用场景

    一.为什么需要启动模式 在Android开发中,我们都知道,在默认的情况下,如果我们启动的是同一个Activity的话,系统会创建多个实例并把它们一一放入任务栈中.当我们点击返回(back)键,这些A ...

  6. Activity(三)—— Activity的启动模式

    Activity的启动模式 1 Activity的LaunchMode Activity为什么需要启动模式?在默认情况下,当我们多次启动同一个Activity的时候,系统会创建多个实例并把它们一一放入 ...

  7. Android 四种启动模式

    2019独角兽企业重金招聘Python工程师标准>>> launchMode <activity android:name=".activity.MainActivi ...

  8. 二、Activity 的启动模式

    一.四种启动模式: ① standard(标准模式) 这个是系统的默认模式.在这种模式下,每次启动一个 Activity 都会重新创建一个新的实例,不管这个实例是否已经存在,并且谁启动了这个 Acti ...

  9. Activity的启动模式

    题目:Activity的启动模式,区别 这道题想考察什么? 启动模式是什么? 启动模式如何设置? Activity的启动模式区别? 应用场景以及那些注意的点? 考察的知识点 启动任务,返回栈,启动模式 ...

最新文章

  1. 设计RPC接口时,你有考虑过这些吗?
  2. 69.2. wget - retrieves files from the web
  3. 以Drools5.5为例说明“规则引擎在业务系统中应用”---起始篇
  4. Weblogic 错误 BEA-000403 BEA-000438解决办法
  5. 路由器01---k2刷Pandora
  6. 近业务=困死在一条船上?
  7. 怎么从转移特性曲线上看dibl_「科普向」这篇让你快速搞懂IGBT的静态特性
  8. [渝粤教育] 厦门工学院 逻辑与批判性思维 参考 资料
  9. 18_多易教育之《yiee数据运营系统》用户画像-事实标签计算篇
  10. 勤哲excel服务器端口协议,用勤哲Excel服务器实现管理完整.doc
  11. leo免费的excel操作界面的进销存供你下载使用
  12. 解决安卓CPU使用率过高问题
  13. 常见短信平台发送的号码有哪些?95开头、106开头短信发送号码区别说明
  14. R语言使用dplyr包的full_join函数基于多个字段(数据列)全连接两个dataframe、按照多列对数据进行全连接
  15. 根据阿里GeoJSON格式生成全国Shp矢量边界
  16. jacob 字体设置
  17. 移动SLAM从入门到入土(二)环境安装
  18. MATLAB轨迹规划 发给ROS中机器人实现仿真运动
  19. 怎么下载免费Adblock Plus
  20. AmchartsFlash图表配置-中文说明

热门文章

  1. OpenCV + python 实现人脸检测(基于照片和视频进行检测)
  2. 项目经理如何参与任务管理
  3. Shell、内外部命令——Linux基本命令(2)
  4. 图像处理------应用卷积一实现噪声消去
  5. 关于jQuery中.attr()和.prop()
  6. 访问者模式讨论篇:java的动态绑定与双分派
  7. 解决IE下jquery ajax无法获得最新数据的问题(IE缓存)
  8. 用.NET CF进行HardReset?
  9. Netty入门(七)使用SSL/TLS加密Netty程序
  10. 《代码大全2》读书笔记 Week 1