文档章节

总结系列--Activity启动模式

k
 kim366
发布于 2016/05/13 19:13
字数 1338
阅读 1
收藏 0
点赞 2
评论 0
      Activity作为Android中重要一环,它有4种不同的启动模式,类似于C语言中的局部变量、全局变量及静态变量等。这4种启动模式如下。 
              standard:标准模式,调用startActivity()方法就会产生一个新的实例。
              singleTop:检查是否已经存在了一个实例位于Activity Stack的顶部,如果存在就不产生新的实例, 反之则调用Activity的newInstance()方法产生一个新实例。
            Q: 若已经存在一个实例但是不位于Activity Stack的顶部,会不会创建新的实例?   会创建
              singleTask:在一个新的Task中产生这个实例,以后每次调用都会使用此实例,而避免产生新的实例。 
              singleInstance:这个基本上跟singleTask一样,只是有一点不同,那就是在这个模式下的Activity实例所处的Task中,只能有这一个Activity实例,而不能有其他的实例。

       这些启动模式在Android清单文件AndroidManifest.xml中,通过<activity>中的launchMode 属性进行设置。
       
        4.4.1   standard标准模式
       在standard模式也就是默认模式下,不需要配置launchMode。
       AndroidManifest.xml中代码如:<activity android:name=".Activity2" android:label="@string/Ac2"/ > 

       4.4.2   singleTop
       singleTop 和 standard 模式,都会将Intent 发送到新的实例(如果已经有了,singleTask 模式和 singleInstance模式不发送到新的实例)。不过,singleTop要求如果创建intent时栈顶已经有要创建Activity的实例,则将Intent发送给该实例,而不发送给新的实例。 还是用刚才的示例,只需Activity2的launchMode 改为singleTop,就能看到区别。
       修改后AndroidManifest.xml中代码如代码:
      <activity  android:name=".Activity2"  android:label="@string/Ac2" android:launchMode="singleTop"/ >
       singleTop模式,可用来解决栈顶多个重复相同的Activity的问题。

      4.4.3   singleTask
       singleTask模式和后面的singleInstance模式都是只创建一个实例的。  当Intent到来,需要创建singleTask模式Activity时,系统会检查栈里面是否已经有该Activity的实例。 如果有直接将Intent发送给它( 注意此时原在此Activity栈中上面的Activity将会被关闭 )。
     
      4.4.4   singleInstance
       在singleInstance模式下,加载该Activity时如果没有实例化,它会在创建新的Task后,实例化入栈,如果已经存在,则直接调用onNewIntent,该Activity的Task中不允许启动其他的Activity,任何从该Activity启动的其他Activity都将被放到其他Task中,先检查是否有在应用的Task,没有的话就创建。

       在这里介绍一下Task(任务)的概念。按照字面意思,任务就是自己要实现的一个目的,而在Android中的Task的定义是一系列Activity的集合,即要达到自己最终要到的Actvity,之前所有经历过的Actvity的集合。它可以是同一个应用内部的,也可以是两个不同应用的。Task可以认为是一个栈,可放入多个Activity。比如,启动一个应用,那么Android就创建了一个Task,然后启动这个应用的入口Activity,就是intent-filter中配置为main和launch的那个。这个Activity是根(Root)Activity,可能会在它的界面调用其他Activity,这些Activity如果按照上面那3个模式,也会在这个栈(Task)中,只是实例化的策略不同而已。
        
        


     Android Task概念以及相关   
        Android Task: 
        Android的Task是一个Activity栈,用来完成用户的某一个目的,而不管这个Acitivity是属于哪个AP的。Task中的Activity可以分属于不同的APP。 
        在Task中,有一个Acitivity叫root activity,它是用来启动一个Task。 
        Tasks在系统中做交互的时候,这个Task所包含的所有Activities会被作为一个整体移动。比方说:Task A被设置成foreground/background task的时候,整个task(activity stack)都会随之移动。 
      (再补充一点就是说:一个Activity栈也可能是由一个或多个Task组成。) 

        Task中还有一个重要的属性就是用户可以中断目前正在做的事情,而去跑另外一个Task。基于这样一个特性,用户就可以同时跑不同的task,而且可以在它们之间切换。 
       有三个方法中断Task:1.Notification;2.用户操作,比如按Home或者开启另外一个程序;3.Activity中自己定义的New Task,比如说Map或者Browser,在Email中选择address会Launch Google Map,选择Link会Launch Browser,等等。 

        Applications: 
        一个Android Application由一个或者多个Acitivity组成,这其中或许还包括一个或多个Service,它会被打包成.apk文件。 
       补充:Launch Activity的四种模式:standard(default),singleTop,singleTask,singleInstance 
       standard或者singleTop activity可以被实例化多个,而singleTask或singleInstance只可以有一个实例。 
   Activity B      Activity B 
   Activity D      Activity B 
   Activity C      Activity D          singleTop = single + top 
   Activity B      Activity C 
   Activity A      Activity A 
   B是singleTop    B不是singleTop 

        开发技巧:  通过startActivityForResult获取另外一个Activity相关的数据,第二个Activity的启动模式不能是SingleTask, 否则不能返回数据直接退出。原因是使用singletask启动模式的时候,如果当前栈中存在这样一个activity,那么这个activity之上的activity会被全部清除出栈,使当前activity处于当前栈顶。

本文转载自:http://blog.csdn.net/oyangyujun/article/details/47958113

共有 人打赏支持
k
粉丝 1
博文 129
码字总数 0
作品 0
朝阳
Android动画:献上一份详细 & 全面的动画知识学习攻略

前言 动画的使用 是 开发中常用的知识 可是动画的种类繁多、使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策 本文将献上一份动画的全面介绍攻略,包括动...

Carson_Ho ⋅ 06/06 ⋅ 0

Android 动画:这是一份详细 & 清晰的 动画学习指南

前言 动画的使用 是 开发中常用的知识 可是动画的种类繁多、使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策 本文将献上一份动画的全面介绍攻略,包括动...

Carson_Ho ⋅ 05/03 ⋅ 0

《Android开发艺术探索》Activity | 生命周期 | 启动模式 | Flags | IntentFilter action data的匹配规则 (一)

说几点 1.文章中大部分(所有吧)的内容都是与《Android开发艺术探索》书中写的内容是一致的,所以可以说是直接copy了一遍(没办法,作者写的太好了)。 2.为什么要copy一遍呢?,主要还是为...

a_zhon ⋅ 05/09 ⋅ 0

Design Patterns in Android:责任链模式

前言 非常抱歉,本系列博客长达半年没更新了,今日偶得灵感,更新一波《设计模式Android篇:责任链模式》。点击此处查看《Design Patterns in Android》系列其他文章。 本文原创作者MichaelX。...

MichaelX ⋅ 05/14 ⋅ 0

Android插件化原理(一)Activity插件化

相关文章 Android深入四大组件系列 Android解析AMS系列 Android解析ClassLoader系列 前言 四大组件的插件化是插件化技术的核心知识点,而Activity插件化更是重中之重,Activity插件化主要有三...

刘望舒 ⋅ 05/29 ⋅ 0

Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)

前言 在 开发中,性能优化策略十分重要 因为其决定了应用程序的开发质量:可用性、流畅性、稳定性等,是提高用户留存率的关键 本文全面讲解性能优化中的所有知识,献上一份 性能优化的详细攻...

Carson_Ho ⋅ 05/30 ⋅ 0

Android解析WindowManagerService(三)Window的删除过程

相关文章 Android系统启动系列 Android深入四大组件系列 Android应用进程启动过程系列 Android解析WindowManager系列 前言 在本系列文章中,我提到过:Window的操作分为两大部分,一部分是W...

刘望舒 ⋅ 05/05 ⋅ 0

Activity启动模式的理解

一、理解 Tasks and Back Stack(任务和后台堆栈) 一个 App 对应一个 Task,该app 内的所有 activity 被安排在一个后台堆栈里。 多窗口模式下:一个windows下可能由多个 Task,系统为每个窗...

Agnes2017 ⋅ 05/04 ⋅ 0

Design Patterns in Android:装饰模式

装饰模式是干嘛的呢?它在项目中有哪些用途呢?装饰模式在Android源码中有哪些应用呢?本文将和读者朋友一起分享探讨装饰者模式在Android中的应用和实践。 转载请注明出处。 装饰模式定义 装...

MichaelX ⋅ 06/13 ⋅ 0

Activity启动模式&Task栈

在AMS中,ActivityRecord对应一个Activity,TaskRecord对应一个Task,每个TaskRecord中保存了若干ActivityRecord,TaskRecord由taskId标识,通过getTaskId()可以获取Activity所属的Task。Act...

JasmineBen ⋅ 05/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部