精华内容
下载资源
问答
  • 任务栈

    2017-05-24 19:33:15
    android任务栈

    android任务栈

    android中有一个管理Activity的栈 task

    这里写图片描述

    栈:先进后出
    列:先进先出

    1.打开一个Activity叫进栈,关闭一个Activity叫出栈(也叫弹栈)

    2.我们操作中的Activity永远是处于栈顶的Activity

    3.任务栈用来存放Activity维护用户操作体验的

    4.程序退出了任务栈也就清空了

    5.一般情况下一个应用程序一个任务栈

    展开全文
  • 要知道什么是小程序的任务栈管理,直接看微信小程序即可: 一次最多启动5个小程序 小程序启动到达上限后,会关闭最久未使用的小程序,并且打开新的小程序。 微信小程序使用时,如下图: 实现要点 小程序的任务栈...

    概述

    微信小程序

    要知道什么是小程序的任务栈管理,直接看微信小程序即可:

    1. 一次最多启动5个小程序
    2. 小程序启动到达上限后,会关闭最久未使用的小程序,并且打开新的小程序。

    微信小程序使用时,如下图:

    实现要点

    小程序的任务栈管理,主要有以下要点:

    1. 如何启动多个任务栈的小程序
    2. 如何限制任务栈的启动个数

    Demo

    Demo的github地址如下:
    https://github.com/Double2hao/ProcessTaskTest

    Demo如下图:

    Demo中打开多任务栈的场景如下:

    关键实现

    如何启动多个任务栈的小程序

    要点:

    1. 让每个界面继承同一个activity
    2. 所有需要启动的页面注册到一个hashmap中,调度的时候就通过这个hashmap来
    public class TestActivityOne extends BaseTestActivity{
    }
    
      private final HashMap<String, TaskStackInfo> mapInfo = new HashMap<>();
    
      private TaskStackManager() {
        mapInfo.put(TestActivityOne.class.getName(),
            new TaskStackInfo("testprocess1", TestActivityOne.class));
        mapInfo.put(TestActivityTwo.class.getName(),
            new TaskStackInfo("testprocess2", TestActivityTwo.class));
        mapInfo.put(TestActivityThree.class.getName(),
            new TaskStackInfo("testprocess3", TestActivityThree.class));
        mapInfo.put(TestActivityFour.class.getName(),
            new TaskStackInfo("testprocess4", TestActivityFour.class));
      }
    

    如何限制任务栈的启动个数

    要点:

    1. 每次启动时,检查任务栈是否到达上限,如果到达上限就需要清理。
    2. 定义最多启动n个任务栈,实际上最多会存在n+1个。每次启动第n+1个任务栈后,再去清理第一个任务栈。

    如果任务栈到达上限后,先杀死进程,再启动新进程会有两个问题:

    1. 杀死进程需要时间,因此会更耗时。
    2. 实现上会更加麻烦,保证进程被杀死后才能启动新进程。否则可能会出现”新启动的进程马上被杀死“的问题。
      public void startTestActivity(Context context) {
        if (context == null) {
          return;
        }
    
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        if (am == null) {
          return;
        }
        List<String> listCurrentProcess = getCurrentProcessList(am);
        if (listCurrentProcess == null) {
          return;
        }
        chooseActivityToStart(context, listCurrentProcess);
    
        //如果已经启动了MAX_PROCESS个进程,start时会启动第MAX_PROCESS+1个,并且清理第一个。
        //todo 这里只是demo演示,如果需要更精准的控制,可以在进程启动后通过ipc来调用清理逻辑
        mainHandler.postDelayed(new Runnable() {
          @Override public void run() {
            checkAndClearOldestProcess(context);
          }
        }, 1000);
      }
    
      private void checkAndClearOldestProcess(Context context) {
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        if (am == null) {
          return;
        }
        List<String> listCurrentProcess = getCurrentProcessList(am);
        if (listCurrentProcess == null) {
          return;
        }
        if (listCurrentProcess.size() > MAX_PROCESS) {
          clearOldestProcess(am);
        }
      }
    

    github

    Demo的github地址如下:
    https://github.com/Double2hao/ProcessTaskTest

    展开全文
  • Activity基础 - 任务栈

    2019-02-19 21:04:25
    什么是任务栈? 前面的文章我们多次提到过一个叫任务栈的东西,那什么是任务栈呢?首先我们先搞清什么是任务,任务的定义: 任务是在执行特定任务的时候与用户交互的一些activity 那什么是任务栈呢? android任务...

    什么是任务栈?

    前面的文章我们多次提到过一个叫任务栈的东西,那什么是任务栈呢?首先我们先搞清什么是任务,任务的定义:

    任务是在执行特定任务的时候与用户交互的一些activity

    那什么是任务栈呢?
    android任务栈简单了解

    1. android任务栈又称为Task,它是一个栈结构,具有后进先出的特性,用于存放我们的Activity组件。
    2. 我们每次打开一个新的Activity或者退出当前Activity都会在一个称为任务栈的结构中添加或者减少一个Activity组件,因此一个任务栈包含了一个activity的集合, android系统可以通过Task有序地管理每个activity,并决定哪个Activity与用户进行交互:只有在任务栈栈顶的activity才可以跟用户进行交互。
    3. 在我们退出应用程序时,必须把所有的任务栈中所有的activity清除出栈时,任务栈才会被销毁。当然任务栈也可以移动到后台, 并且保留了每一个activity的状态. 可以有序的给用户列出它们的任务, 同时也不会丢失Activity的状态信息。
    4. 需要注意的是,一个App中可能不止一个任务栈,某些特殊情况下,单独一个Actvity可以独享一个任务栈。还有一点就是一个Task中的Actvity可以来自不同的App,同一个App的Activity也可能不在一个Task中。

    实际使用

    我们来认识一个参数:TaskAffinity 。这个蚕食可以翻译为任务相关性。这个参数标识了一个activity所需的任务栈的名字。在默认情况下,所有activity所需的任务栈的名称为应用的包名(PackgeName)。这个参数是可以自定义的,但是有一定的规则:例如:不能和包名 相同;要符合命名规范等。TaskAffinity 属性要和singleTask启动模式或者allowTaskReparenting属性配对使用,在其他情况下使用没有意义。

    示例

    我们通过几个场景来认识一下这个任务栈。并且了解一下TaskAffinity 的使用。

    • 示例1:
      <activity android:name=".ThirdActivity">
            </activity>
            <activity
                    android:name=".MainActivity"
                    android:launchMode="singleInstance">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
    
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
    

    在这里插入图片描述
    从日志可以看出,此时只有一个id为64 的任务栈,栈内有两个activity:MainActivity 和 ThirdActivity,我们前面文章已经分析过,默认的启动模式是standard模式,此模式启动的activity会重复创建,并且放在启动他的任务栈中,遵循先进后出的原则。然后

    • 示例2:
      我们改变一下启动模式:
       <activity android:name=".ThirdActivity"
            android:taskAffinity="com.xyd.task1">
            </activity>
            <activity
                    android:name=".MainActivity"
            android:launchMode="singleTask">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
    
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
    

    在这里插入图片描述
    我们可以看到,现在有两个任务栈,id分别是66 和 65 ,看一下任务栈的名字:
    在这里插入图片描述

    红框标注的位置就是task任务栈的信息。

    以上就是我自己做的demo,验证任务栈的使用及特征,说的比较浅,以后如果能深入学习的话,再写点深入的东西。
    欢迎批评指正。
    
    展开全文
  • ARM:FreeRTOS系统栈和任务栈

    千次阅读 2019-11-15 15:46:18
    ARM:FreeRTOS系统栈和任务栈 背景:ARM 有两个栈指针PSP和MSP, 通过Control 寄存器来决定SP(R13)使用哪个栈。我们下面谈论的系统栈和任务栈,就和这两个栈指针有关。 FreeRTOS 任务栈 FreeRTOS不同于裸机每个...

    ARM:FreeRTOS系统栈和任务栈

    背景:ARM 有两个栈指针PSP和MSP, 通过Control 寄存器来决定SP(R13)使用哪个栈。我们下面谈论的系统栈和任务栈,就和这两个栈指针有关。

    在这里插入图片描述

    FreeRTOS 任务栈

    FreeRTOS不同于裸机每个TASK都有一个任务栈。FreeRTOS的任务栈是在任务创建的时候从FreeRTOSConfig.h 定义的Heap 空间中申请:

    #define configTOTAL_HEAP_SIZE                   ((size_t)1024 * 9)
    

    具体任务栈创建的格式如下:(任务栈的大小是 usStackDepth*4)
    在这里插入图片描述
    注意:这种创建方式是动态创建栈的方式,所以会放在Heap 空间中申请。

    申请任务栈空间的code如下:

    在这里插入图片描述FreeRTOS会定义两个栈指针来表明任务栈的大小:
    1、 *pxTopOfStack栈顶指针
    2、*pxStack 栈的起始地址

    注意:pxTopOfStack-pxStack会小于分配的任务栈的大小,原因是arm和FreeRTOS系统会额外保存一些寄存器,用于TASK的切换和返回。

    具体形式如下(栈的生长方式可以设置,这边默认是从高往低):
    在这里插入图片描述

    在创建任务栈的过程中,FreeRTOS 会切换 arm 的栈指针,将栈指针切换到PSP,
    通过将Control [1] 置 1实现。


    FreeRTOS 系统栈

    上面跟大家讲解了什么是任务栈,这里的系统栈又是什么呢?裸机的情况下,我们在ld script 中定义一个栈空间,并在Startup.S 中将MSP指向这个栈空间,这个就是系统栈。

    arm-CM3 中系统复位后给MSP赋的初值就是我们定义的系统栈。
    系统栈使用MSP指针。

    在这里插入图片描述
    在 RTOS 下,任务栈是不使用这里的空间的。 既然任务栈不使用这里的栈空间,那么哪里要使用这里的栈空间呢?答案就在中断函数和中断嵌套。

    **之前讲过 arm M3 内核是具有双堆栈指针,MSP 主堆栈指针和 PSP 进程堆栈指针,或者叫 PSP任务堆栈指针也是可以的。

    在 FreeRTOS 操作系统中,主堆栈指针 MSP 是给系统栈空间使用的,进程堆栈指针 PSP 是给任务栈使用的。 也就是说,在 FreeRTOS 任务中,所有栈空间的使用都是通过PSP 指针进行指向的。 一旦进入了中断函数以及可能发生的中断嵌套都是用的 MSP 指针。

    在这里插入图片描述


    系统栈和任务栈的分配

    • 任务栈空间的分配

    FreeRTOS 中每个任务都需要自己的栈空间,栈空间的大小需要考虑如下几个方面:

    • 函数的嵌套调用:

    • 函数局部变量。

    • 函数形参,一般情况下函数的形参是直接使用的 CPU 寄存器,不需要使用栈空间,但是这个函数中如果还嵌套了一个函数的话,这个存储了函数形参的 CPU 寄存器内容是要入栈的。

    • 函数返回地址,arm中一般函数的返回地址是专门保存到 LR(LinkRegister)寄存器中的,如果这个函数里面还调用了一个函数的话,这个存储了函数返回地址的 LR 寄存器内容是要入栈的。

    • 函数内部的状态保存操作也需要额外的栈空间。

    • 任务切换,任务切换时所有的寄存器都需要入栈。

    • ARM 在任务执行过程中,如果发生中断:

    • M3 内核的 MCU 有 8 个寄存器是自动入栈的,这个栈是任务栈,进入中断以后其余寄存器入栈以及发生中断嵌套都是用的系统栈。

    • M4 内核的 MCU 有 8 个通用寄存器和 18 个浮点寄存器是自动入栈的,这个栈是任务栈,进入中断以后其余通用寄存器和浮点寄存器入栈以及发生中断嵌套都是用的系统栈。

    注意:进入中断以后使用的局部变量以及可能发生的中断嵌套都是用的系统栈。进入中断后系统会自动将栈指针切换到MSP,退出中断后再切回PSP。

    在这里插入图片描述

    • 系统栈空间的分配

    实际应用中系统栈空间分配多大,主要是看可能发生的中断嵌套层数,下面我们就按照最坏执行情况进行考虑,所有的寄存器都需要入栈,此时分为两种情况:
    (进入中断后,系统会自动将SP切到MSP)

    • 64 字节

    对于 Cortex-M3 内核和未使用 FPU(浮点运算单元)功能的 Cortex-M4 内核在发生中断时需要将 16 个通用寄存器全部入栈,每个寄存器占用 4 个字节,也就是 16*4 = 64 字节的空间。
    可能发生几次中断嵌套就是要 64 乘以几即可。 当然,这种是最坏执行情况,也就是所有的寄存器都入栈。

    (注:任务执行的过程中发生中断的话,有 8 个寄存器是自动入栈的,这个栈是任务栈,进入中断以后其余寄存器入栈以及发生中断嵌套都是用的系统栈

    • 200 字节

    对于具有 FPU(浮点运算单元)功能的 Cortex-M4 内核,如果在任务中进行了浮点运算,那么在发生中断的时候除了 16 个通用寄存器需要入栈,还有 34 个浮点寄存器也是要入栈的,也就是(16+34)*4 = 200 字节的空间。当然,这种是最坏执行情况,也就是所有的寄存器都入栈。
    (注:任务执行的过程中发送中断的话,有 8 个通用寄存器和 18 个浮点寄存器是自动入栈的,这个栈是任务栈,进入中断以后其余通用寄存器和浮点寄存器入栈以及发生中断嵌套都是用的系统栈


    FreeRTOS 中提供了一个比较好用的栈函数,可以计算出Task 使用了多少栈空间:

    uxTaskGetStackHighWaterMark 会显示出Task历史上使用的最大栈深度是多少,返回值是历史上该Task所剩余的最小栈空间的大小。

    在这里插入图片描述

    展开全文
  • Activity任务栈 launchMode

    2018-03-25 00:36:39
    Activity任务栈 Activity任务栈的使用以及意思 <!-- standard默认的模式 以栈的形式存储到应用容器中 --> <!-- singleTop 如果该Activity在栈顶 就不会重新启动了 比如我们设置一个登陆页面 ...
  • activity 任务栈

    2016-01-07 11:43:13
    任务栈的概念在面试的时候 或者开发的时候遇到一些特殊问题 会用到 看了android的官方文档 他的解释是 任务栈的作用:记录存放用户开启的activity的。记录activity开启的先后顺序 所以 谷歌引入了任务栈的概念,帮助...
  • Activity任务栈

    2016-04-19 22:56:42
    3.一个应用程序一被开启系统就给他分配一个任务栈,当所有的activity都退出的时候,任务栈就清空了。 4.任务栈的id是一个integer的数据类型 自增长的。 5.在android操作系统里面会存在多个任务栈,一个应用程
  • AndroidApp任务栈

    2020-05-07 15:05:25
    因为我一个App里面的一个界面是WebView做的,这个WebView的里面的内容跟一个单独的应用没什么区别,所以希望它在任务栈单独显示一个位置,如何实现呢,其实很简单,步骤如下: 1、新建一个Android项目,默认就有...
  • Android任务栈简介

    2017-07-06 18:30:44
    1 各个Activity之间是通过Intent连接的,而Android系统,通过栈结构来保存整个App的Activity,栈低的元素是整个任务栈的发起者. 2 当一个App启动的时候,当前环境中没有该App的任务栈,则会创建一个新的任务栈,之后,这个...
  • 清空任务栈

    2016-08-27 18:34:41
    Activity关于任务栈的一些属性
  • Android activity任务栈

    千次阅读 2015-12-07 10:18:32
    任务栈,从它的名字我们就知道它有栈的特点『先进后出』,默认情况下activity的任务栈的名字就是你app的包名,当然,你也可以单独的为你的activity指定任务栈,通过修改TaskAffinity属性,当然不要指定成包名啦,...
  • 使用adb查看任务栈

    千次阅读 2018-07-14 14:43:37
    开个头 在学习activity启动模式的时候,尤其是学到清单文件里taskaffinity这...根据ActivityManager获取当前的任务栈(按手机的任务键,显示后台正在运行的程序,这些其实都是一个个的任务栈),也就是当前在屏幕运...
  • 任务栈简单入门

    千次阅读 2018-06-27 09:33:56
    最近又把两本进阶书看了一遍,但总感觉好记性不如烂笔头,所以还是决定通过博客记录一下,我们将分两篇来全面深入地记录Activity 启动模式与任务栈的内容。android任务栈简单了解1. android任务栈又称为Task,它是一...
  • android任务栈

    2014-06-04 07:32:55
    1.启动任务栈  第一种,动作设置为“android.intent.action.MAIN”,类别设置为“android.intent.category.LAUNCHER”, 可以使这个ACT(activity)实例称为一个任务栈的入口,拥有这种类型的intent-filter的ACT...
  • android Activity任务栈使用总结

    千次阅读 2020-08-01 14:33:53
    android上对于任务栈的控制还是比较常见的,尤其是在小程序、小游戏的场景。 笔者近期也有在实际项目中碰到,因此就好好学习了一下,作此文以记录。 本文主要还是自己的一些使用总结,如有不对或者需要补充的地方,...
  • Android任务栈的理解

    2018-11-28 14:30:58
    命令是adb shell dumpsys activity 记录下两位不错的总结理解task任务栈 Activity启动模式
  • Activity的任务栈

    2013-12-15 16:52:39
    Android任务栈,manifest
  • Android Task任务栈

    2016-04-17 18:15:54
    做了一年多两年的Android研发,Activity一直在使用,而关于Activity任务栈类型,一直都属于知道,了解的状态,一直没有深入进去研究,所以在开发过程中,也是一直用着default的任务栈模式。趁着这次遇到一个bug,那...
  • 3.一个应用程序一被开启系统就给他分配一个任务栈,当所有的activity都退出的时候,任务栈就清空了。 4.任务栈的id是一个integer的数据类型 自增长的。 5.在android操作系统里面会存在多个任务栈,一个应用程...
  • intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);...这两个 Flag 可以将原有任务栈清空,并将 intent 的目标 Activity 作为任务栈的根 Activity 。任务栈的 Id 不变,也就是说,并没有开辟新的任务栈。 ...
  • Android Activity任务栈

    千次阅读 2016-08-20 19:33:44
    1. Activity任务栈 Activity任务栈是Android对Activity界面的一种管理方式。任务栈,顾名思义就是“后进先出”,也就是说,当从一个Activity中启动一个新的Activity界面时,新界面将位于Activity栈的栈顶;当...
  • 摘要:LiteOS任务栈是高地址向低地址生长的递减栈,栈指针指向即将入栈的元素位置。
  • 一、问题背景 在《Android开发艺术与探索》的第1.2.1章节的singleInstance启动模式中,作者举出了下面的一个例子: 在一个应用中,它有A、B、C、D这4个活动,其中C是...这样可以保证A、B在名字为包名的任务栈中,而...
  • Android任务栈 什么是任务栈: Android任务栈又称Task,它是一种栈结构,具有后进先出的特点,用于存放Activity。且只有栈顶的Activity能与用户进行交互。在退出应用时,必须把任务栈中的Activity全部清理出栈,此时...
  • 15_Android中任务栈

    千次阅读 2015-07-10 01:23:49
    3.一个应用程序一被开启系统就给他分配一个任务栈,当所有的activity都退出的时候,任务栈就清空了。4.任务栈的id是一个integer的数据类型 自增长的。5.在android操作系统里面会存在多个任务栈,一个应用程序一个...
  • android 任务栈及启动模式

    千次阅读 2014-12-17 19:04:38
    3.一个应用程序一被开启系统就给他分配一个任务栈,当所有的activity都退出的时候,任务栈就清空了。 4.任务栈的id是一个integer的数据类型 自增长的。 5.在android操作系统里面会存在多个任务栈,一个应用程
  • Android任务栈

    2016-01-06 23:36:47
    最近在读一些Android方面的工具... 谈到Android任务栈,就必须提到AndroidManifest里的几种启动方式。standard方式就不用赘述了,是我们Activity默认的启动方式。如果我们的启动Activity的方式是singleTop的话,那么在
  • 查看andorid应用Activity任务栈

    万次阅读 2017-03-28 19:01:39
    在实际开发过程中会碰到一些问题,需要通过分析应用的任务栈信息,比如查看栈顶activity,不同启动模式launchMode下Activity任务栈情况。Android提供一个很强大的adb shell指令进行查看。 1.在终端或者Android ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 234,841
精华内容 93,936
关键字:

任务栈