1.一个应用程序一般都是由多个activity组成的。

2.任务栈(task stack)(别名backstack后退栈)记录存放用户开启的activity的。

3.一个应用程序一被开启系统就给他分配一个任务栈,当所有的activity都退出的时候,任务栈就清空了。

4.任务栈的id是一个integer的数据类型 自增长的。

5.在android操作系统里面会存在多个任务栈,一个应用程序一个任务栈。

6.桌面应用和一般的应用程序是一样的,任务栈的行为也是一样的。

7.默认情况下,关闭掉一个应用程序,清空了这个应用程序的任务栈。应用程序的进程还会保留。

为什么要引入任务栈的概念:

window下,可以通过点击任务栏  切换任务

android下,长按小房子,切换任务。

为了记录用户开启了哪些activity,记录这些activity开启的先后顺序,google引入任务栈。(task stack)概念,帮助维护好的用户体验。

Activity的启动模式

Standard 默认标准的启动模式,每次startActivity都是创建一个新的activity的实例。适用于绝大多数情况。

singleTop 单一顶部,如果要开启的activity在任务栈的顶部已经存在,就不会创建新的实例。而是调用onNewIntent()方法。应用场景:浏览器书签。避免栈顶的activity被重复的创建,解决用户体验的问题。

singletask 单一任务栈 , activity只会在任务栈里面存在一个实例。如果要激活的activity,在任务栈里面已经存在,就不会创建新的activity,而是复用这个已经存在的activity,调用 onNewIntent() 方法,并且清空当前activity任务栈上面所有的activity

应用场景:浏览器activity, 整个任务栈只有一个实例,节约内存和cpu的目的

注意: activity还是运行在当前应用程序的任务栈里面的。不会创建新的任务栈。

singleInstance 单状态   单例模式

单一实例,整个手机操作系统里面只有一个实例存在,不同的应用去打开这个activity共享,公用的同一个activity。

它会运行在自己的单独,独立的任务栈里面,并且任务栈里面只有他一个实例存在。

应用场景:呼叫来点界面InCallScreen

案例,编写如下案例

1 android清单文件的内容如下:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.itheima.taskstack"

android:versionCode="1"

android:versionName="1.0" >

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="19" />

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name="com.itheima.taskstack.MainActivity"

android:label="@string/app_name" >

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

<activity android:name="com.itheima.taskstack.SecondActivity"

android:launchMode="singleInstance"

>

<intent-filter>

<action android:name="com.itheima.task.single"/>

<category android:name="android.intent.category.DEFAULT" />

</intent-filter>

</activity>

</application>

</manifest>

2 布局文件activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context=".MainActivity" >

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="我是界面01"

android:textSize="30sp"/>

<Button

android:onClick="open01"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="开启界面01"/>

<Button

android:onClick="open02"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="开启界面02"/>

</LinearLayout>

3 布局文件activity_second.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context=".MainActivity" >

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="我是界面02"

android:textSize="30sp" />

<Button

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:onClick="open01"

android:text="开启界面01" />

<Button

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:onClick="open02"

android:text="开启界面02" />

</LinearLayout>

4 MainActivity

package com.itheima.taskstack;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

System.out.println("01activity被创建了。任务栈id:"+getTaskId());

}

public void open01(View view){

Intent intent = new Intent(this,MainActivity.class);

startActivity(intent);

}

public void open02(View view){

Intent intent = new Intent(this,SecondActivity.class);

startActivity(intent);

}

}

5 SecondActivity

package com.itheima.taskstack;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

public class SecondActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_second);

System.out.println("02activity被创建了。任务栈id:" + getTaskId());

}

public void open01(View view) {

Intent intent = new Intent(this,MainActivity.class);

startActivity(intent);

}

public void open02(View view) {

Intent intent = new Intent(this,SecondActivity.class);

startActivity(intent);

}

@Override

protected void onNewIntent(Intent intent) {

System.out.println("o2activityonnew intent.任务栈id:" + getTaskId());

super.onNewIntent(intent);

}

}

15_Android中任务栈的更多相关文章

  1. 关于VS中更改栈和堆空间的大小

    编号:1008时间:2016年4月12日17:01:38功能:关于VS中更改栈和堆空间的大小 URL:http://blog.csdn.net/icerock2000/article/details/ ...

  2. IL中的栈和闪电的Owin推荐

    最近几天有幸得到闪电大哥的指点,了解了EMIT和IL中的一些指令.虽然有高射炮打蚊子的说法,但是我相信“二八定律”,80%的功能可以用20%的技术解决,20%的功能只能用80%的技术解决.大哥的博客: ...

  3. Lua 和 C 交互中虚拟栈的操作

    Lua 和 C 交互中虚拟栈的操作 /* int lua_pcall(lua_State *L, int nargs, int nresults, int msgh) * 以保护模式调用具有" ...

  4. Lua的函数调用和协程中,栈的变化情况

    Lua的函数调用和协程中,栈的变化情况 1. lua_call / lua_pcall   对于这两个函数,对栈底是没有影响的--调用的时候,参数会被从栈中移除,当函数返 回的时候,其返回值会从函数处 ...

  5. js 中的栈和堆

    js中的栈与堆的讲解/基本数据类型与引用类型的讲解 前言:1. 学习前端,入门简单,想学好确实是一件很困难的事情,东西多而且杂,版本快速迭代,产品框架层出不穷. 2. 前端学习成本确实很高,需要不断的 ...

  6. javascript中的栈、队列。

                           javascript中的栈.队列 栈方法     栈是一种LIFO(后进先出)的数据结构,在js中实现只需用到2个函数 push()  接受参数并将其放置 ...

  7. 面试01:解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法

    栈的使用:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间. 队的使用:通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域 ...

  8. 浅谈Java中的栈和堆

    人们常说堆栈堆栈,堆和栈是内存中两处不一样的地方,什么样的数据存在栈,又是什么样的数据存在堆中? 这里浅谈Java中的栈和堆 首先,将结论写在前面,后面再用例子加以验证. Java的栈中存储以下类型数 ...

  9. Java中 堆 栈,常量池等概念解析(转载)

    1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符 ...

随机推荐

  1. CentOS, Fedora, or Red Hat一行命令安装apache + mysql + php 及各种依赖库

    sudo sh -c "yum install httpd httpd-devel mysql mysql-server mysql-devel php php-mysql php-comm ...

  2. 03_OGNL

    1.值栈: 解答Struts能够直接获取属性值: 原因:Struts并不是直接通过request隐式对象中获取,而是将整个对象封装到了ValueStack值栈中,直接匹配是否存在这个属性,找到了就取出 ...

  3. Check the string CodeForces - 960A

    A has a string consisting of some number of lowercase English letters 'a'. He gives it to his friend ...

  4. PHP 实例 AJAX 投票

    AJAX 投票 在下面的实例中,我们将演示一个投票程序,通过它,投票结果在网页不进行刷新的情况下被显示. Do you like PHP and AJAX so far? Yes: No: 实例解释 ...

  5. springMVC源码分析--HandlerMethodReturnValueHandlerComposite返回值解析器集合(二)

    在上一篇博客springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)我们介绍了返回值解析器HandlerMethodReturnValueHand ...

  6. JVM的Server与Client运行模式区别与切换

    概述 JVM有两种运行模式Server与Client.两种模式的区别在于,Client模式启动速度较快,Server模式启动较慢:但是启动进入稳定期长期运行之后Server模式的程序运行速度比Clie ...

  7. leetcode 5 Longest Palindromic Substring--最长回文字符串

    问题描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  8. Activtiy完全解析(二、layout的inflate过程)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/52457893 本文出自:[openXu的博客]   在上一篇文章<Activtiy完全 ...

  9. 网卡配置和DNS配置,手动挂在nas存储的共享目录,网络相关其它操作命令,修改防火墙中的端口配置,resolv.conf配置详细介绍和网卡信息配置详细介绍

    1.   网卡配置和DNS配置 若想服务器能够发邮件,需要让部署的服务器能够访问到外网环境.若部署的服务器访问不到外网,通过ping www.baidu.com的方式执行的时候,会出现以下问题: &q ...

  10. J2EE中MVC的各层的设计原则及其编写注意事项

    总结了下J2EE的MVC模式开发原则,很多细节处理好了是很有利于开发与维护的. 下面就从各层说起. 视图层 主要是客户端的显示,主要是JSP和HTML,随着Web的不断发展,许多基于Javascrip ...