task与activity的四大lanchmodle

  最近在根据有心课程的教程来学习,最近学习了activity的lanchmodle,年初的一个项目中,就遇到了由lanchmodle导致的bug,当时对lanchmodle了解还不够深入,花了些时间,通过了其它方式解决。这次更进一步了解了lanchmodle后,回头一看,完全可以通过设置lanchmodle来解决当初的问题。

  1.task

  简单的说,就是一组以栈的模式聚集在一起的Activity组件集合。它们有潜在的前后驱关联,新加入的Activity组件,位于栈顶,并仅有在栈顶的Activity,才会有机会与用户进行交互。而当栈顶的Activity完成使命退出的时候,Task会将其退栈,并让下一个将跑到栈顶的Activity与用户进行交互,直至栈中再无更多Activity,Task结束。

  2.lanchmodle

  standard模式:是默认的也是标准的Task模式,在没有其他因素的影响下,使用此模式的Activity,会构造一个Activity的实例,加入到调用者的Task栈中去,对于使用频度一般开销一般什么都一般的Activity而言,standard模式无疑是最合适的,因为它逻辑简单条理清晰,所以是默认的选择。

  singleTop模式,基本上于standard一致,仅在请求的Activity正好位于栈顶时,有所区别。此时,配置成singleTop的Activity,不再会构造新的实例加入到Task栈中,而是将新来的Intent发送到栈顶Activity中,栈顶的Activity可以通过重载onNewIntent来处理新的Intent(当然,也可以无视...)。这个模式,降低了位于栈顶时的一些重复开销,更避免了一些奇异的行为(想象一下,如果在栈顶连续几个都是同样的Activity,再一级级退出的时候,这是怎么样的用户体验...),很适合一些会有更新的列表Activity展示。一个活生生的实例是,在Android默认提供的应用中,浏览器(Browser)的书签Activity(BrowserBookmarkPage),就用的是singleTop。

  singleTask的Activity,最多仅有一个实例存在,并且,位于以它为根的Task中。所有对该Activity的请求,都会跳到该Activity的Task中展开进行。singleTask,很象概念中的单件模式,所有的修改都是基于一个实例,这通常用在构造成本很大,但切换成本较小的Activity中。应用场景:大多数App的主页。对于大部分应用,当我们在主界面点击回退按钮的时候都是退出应用,那么当我们第一次进入主界面之后,主界面位于栈底,以后不管我们打开了多少个Activity,只要我们再次回到主界面,都应该使用将主界面Activity上所有的Activity移除的方式来让主界面Activity处于栈顶,而不是往栈顶新加一个主界面Activity的实例,通过这种方式能够保证退出应用时所有的Activity都能报销毁。

  singleInstance显得更为极端一些。在大部分时候singleInstance与singleTask完全一致,唯一的不同在于,singleInstance的Activity,是它所在栈中仅有的一个Activity,如果涉及到的其他Activity,都移交到其他Task中进行。这使得singleInstance的Activity,像一座孤岛,彻底的黑盒,它不关注请求来自何方,也不计较后续由谁执行。在Android默认的各个应用中,很少有这样的Activity.

  

  设置Intent的Flag

  系统提供了两种方式来设置一个Activity的启动模式,除了在AndroidManifest文件中设置以外,还可以通过Intent的Flag来设置一个Activity的启动模式,下面我们在简单介绍下一些Flag。

  FLAG_ACTIVITY_NEW_TASK

  使用一个新的Task来启动一个Activity,但启动的每个Activity都讲在一个新的Task中。该Flag通常使用在从Service中启动Activity的场景,由于Service中并不存在Activity栈,所以使用该Flag来创建一个新的Activity栈,并创建新的Activity实例。

  FLAG_ACTIVITY_SINGLE_TOP

  使用singletop模式启动一个Activity,与指定android:launchMode=“singleTop”效果相同。

  FLAG_ACTIVITY_CLEAR_TOP

  使用SingleTask模式来启动一个Activity,与指定android:launchMode=“singleTask”效果相同。

  FLAG_ACTIVITY_NO_HISTORY

  Activity使用这种模式启动Activity,当该Activity启动其他Activity后,该Activity就消失了,不会保留在Activity栈中。

  3.总结
  standard  每次都会新建,每个Task都可以有,且每个Task都可以有多个实例(每个Task都可以有,且可以有多个)
  singleTop 当前实例如果在栈顶,就不新建实例,调用其OnNewIntent。 如不在栈顶,则新建实例 (每个Task都可以有,且可以有多个,在栈顶时可复用)
  singleTask 新建一个Task,如果已经有其他的Task并且包含该实例,那就直接调用那个Task的实例。(只有一个Task中会有)
  singleInstance 新建一个Task,且在该Task中只有它的唯一一个实例。 (只有一个Task会有,且该Task中只有它)

  4.遗留问题:

  期望通过 adb shell dumpsys activity 查看任务栈activity的排列顺序时,打印信息过多,无法准确、快速定位到所需信息。

注:本文参考:

  http://www.jianshu.com/p/2a9fcf3c11e4

  http://www.mamicode.com/info-detail-670343.html

时间: 2024-08-24 05:35:53

task与activity的四大lanchmodle的相关文章

Android中Activity的四大启动模式实验简述

作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activity的四大启动模式. 演示效果如下: 第一步:实验前准备,相关配置文件以及Activity的建立 (1)AndroidMainfest.xml配置文件 1 <?xml version="1.0" encoding="utf-8"?> 2 <manif

Task和Activity相关

这段时间在做一个项目,发现对Task和Activity掌握的还是不牢固.把相关知识整理在这里,方便查阅,有几个Flag没看明白啥意思,也没测试出来效果如何... android:allowTaskReparenting    用来标记Activity能否从启动的Task移动到有着affinity的Task(当这个Task进入到前台时)——“true”,表示能移动,“false”,表示它必须呆在启动时呆在的那个Task里.    如果这个特性没有被设定,设定到<application>元素上的a

Task 和 Activity 回退栈操作。

首先说一下Task是一个什么概念吧:Task是一个包含activity的列表.没 错,简单的说就是按照启动的先后来排队的一个队列.Back Stack,就是回退栈的意思:那么有什么用?Back Stack是存储一个Task的实现方式,一个容器.它具有栈的特性:后进先出. 那么,依据什么来把activity指定给某个Task? ------默认情况下,根据activity的启动的顺序,加入A启动了B,那么B默认情况下就放到了 A的Task的Back Stack里面啦.当然,你也可以去修改这一个默认

关于android初学者必须掌握的Activity的四大知识点

这几天一直都在捣鼓android的知识点,兴趣班的老师,讲课太过深奥,天(想到什么就见什么,后后面完全不想听),最后自己找资料总结了在Android学习中很重要的一个组件Activity,那就开始吧! 第一:掌握Activity的四种状态及什么时候触发 首先我们要知道什么是Activity,简单来说Activity其实就是一个屏幕的显示页面.(简单的阐述) 我们知道Activity是由Activity栈进管理,当来到一个新的Activity后,此Activity将被加入到Activity栈顶,之

四大组件之Activity小结

一大波面试就要靠近,赶紧总结总结一些基础问题 1.Activity的概念 是Android应用层开发的四大组件之一,主要负责和用户交互部分,有自己的生命周期,在其上可以布置按钮,文本框等各种控件,简单来说就是Android的UI部分, 注1:Activity之间通过Intent进行通信.(在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据) 注2:Activity与View的区别 1)     Activity是四大组件中唯一一个用来和用户进行交互的组件.可以说Activit

Activity、Task、应用和进程

http://www.cnblogs.com/franksunny/archive/2012/04/17/2453403.html 很想弄清楚启动一个Activity和Task(任务)的关系,网上也有很多相关资料,由从源码来具体分析的,也有针对launchmode来分析,但都不是自己的,理解起来总不是那么容易,为此,尝试着自己去理解其中的逻辑.不过事先需要弄清楚两个问题: 谁负责管理Activity? Android的framework框架中采用C/S的方式实现由后台服务ActivityMana

Android activity四大启动模式详解

Activity中四大启动模式 在AndroidManifest.xml中 ,有一个默认的activity  在它里面可以设置activity启动模式,  android:launchMode=""  ,该属性用于配置Activity的加载模式,该属性支持4中属性  每不同的模式出现不同的效果,下面详解启动模式. standard:标准模式,默认加载模式 singleTop:Task顶单例模式 singleTask:Task内单例模式 singleInstance:全局单单例模式 1

四大组件之Activity(下)——Activity的常用Manifest属性、启动模式、ADB调试

第5节 Activity的Manifest配置 5.1 Activity的声明 Activity作为四大组件,代码中每定义一个Activity就需要在AndroidManifest.xml文件中声明它. <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.anddle.activitytest"> <application android

android四大组件之Activity - (1)从源码中理解并巧用onWindowFocusChanged(boolean hasFocus)

这里开始到后面,想趁着有时间,将Android四大组件和一些系统组件做一些总结和记录.由于网上已经有很多写的很好并且总结也全面的文章.小弟我也囊中羞涩不敢献丑,就记录一些自己觉得重要的有用的知识点,顺便大家一起学习讨论啥的也好 Activity作为四大组件之一,对于整个Android开发有多重要就无需赘言了.关于它的生命周期,这里借用下官网的图,便一目了然: 那么它的生命周期和我们所说的onWindowFocusChanged(boolean hasFocus)方法有何关系? Activity生