文档章节

总结系列--Activity启动模式

k
 kim366
发布于 2016/05/13 19:13
字数 1338
阅读 1
收藏 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中启动Activity活动的另一种写法|SquirrelNote

系列文章: Activity的4种启动模式及使用场合|SquirrelNote Android中Activity之间的数据传递|SquirrelNote Android中启动Activity活动的另一种写法|SquirrelNote 基类Activity|SquirrelNote...

跳动的松鼠
2017/11/28
0
0
基类Activity|SquirrelNote

系列文章: Activity的4种启动模式及使用场合|SquirrelNote Android中Activity之间的数据传递|SquirrelNote Android中启动Activity活动的另一种写法|SquirrelNote 基类Activity|SquirrelNote...

跳动的松鼠
2017/11/28
0
0
自定义View中Measure过程基础:MeasureSpec类

前言 在了解自定义三大流程的过程前,我们需要了解一个重要基础: 今天,我将全面解析 类的相关知识,希望你们会喜欢 文章较长,建议收藏等充足时间再进行阅读 目录 int specMode = Measure...

Carson_Ho
06/19
0
0
[Andriod] android中singleTask的home键的问题

在Android设计中遇到这样一个问题: Activity A,在AndroidManifest.xml中设置它的一个<inter-filter>为 Java代码 <intent-filter> <action android:name="android.intent.action.MAIN" /> <......

枫兮兮
2014/03/19
2.8K
0
Android AOSP基础(五)Android Studio调试系统源码的三种方式

本文首发于微信公众号「刘望舒」 关联系列 Android AOSP基础系列 Android系统启动系列 应用进程启动系列 Android深入四大组件系列 Android深入理解Context系列 Android深入理解JNI系列 Andr...

刘望舒
08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EDI 电子数据交换全解指南

EDI(Electronic Data Interchange,电子数据交换)技术使得企业与企业(B2B)实现通信自动化,帮助交易伙伴和组织更快更好地完成更多工作,并消除了人工操作带来的错误。从零售商到制造商、物...

EDI知行软件
今天
3
0
CentOS7的LVM动态扩容

# 问题 CentOS7上面的磁盘空间有点紧张,需要扩容。 解决 查询当前磁盘状态 [root@xxx ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTfd0 2:0 1 4K ...

亚林瓜子
今天
3
0
Kafka 0.8 Producer (0.9以前版本适用)

Kafka旧版本producer由scala编写,0.9以后已经废除 示例代码如下: import kafka.producer.KeyedMessage;import kafka.javaapi.producer.Producer;import kafka.producer.ProducerConfig;......

实时计算
今天
5
0
Giraph源码分析(八)—— 统计每个SuperStep中参与计算的顶点数目

作者|白松 目的:科研中,需要分析在每次迭代过程中参与计算的顶点数目,来进一步优化系统。比如,在SSSP的compute()方法最后一行,都会把当前顶点voteToHalt,即变为InActive状态。所以每次...

数澜科技
今天
6
0
Navicat 快捷键

操作 结果 ctrl+q 打开查询窗口 ctrl+/ 注释sql语句 ctrl+shift +/ 解除注释 ctrl+r 运行查询窗口的sql语句 ctrl+shift+r 只运行选中的sql语句 F6 打开一个mysql命令行窗口 ctrl+l 删除一行 ...

低至一折起
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部