背景知识

Activity四种启动模式

  • 标准模式 standard
  • 栈顶复用模式 singleTop
  • 栈内复用模式 singleTask
  • 单例模式 singleInstance

任务栈

Activity的Flags

Activity的Flags很多,这里介绍集中常用的,用于设定Activity的启动模式。可以在启动Activity时,通过Intent的addFlags()方法设置。

(1)FLAG_ACTIVITY_NEW_TASK 其效果与指定Activity为singleTask模式一致。

(2)FLAG_ACTIVITY_SINGLE_TOP 其效果与指定Activity为singleTop模式一致。

(3)FLAG_ACTIVITY_CLEAR_TOP 具有此标记位的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。如果和singleTask模式一起出现,若被启动的Activity已经存在栈中,则清除其之上的Activity,并调用该Activity的onNewIntent方法。如果被启动的Activity采用standard模式,那么该Activity连同之上的所有Activity出栈,然后创建新的Activity实例并压入栈中。

四种启动模式的基础功能就不再赘述;

问题:

(1)如果在Service或Application中启动一个Activity,其并没有所谓的任务栈,怎么实现?

  • 可以使用标记位Flag来解决。解决办法:为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,创建一个新栈。

(2)除了singleInsatance模式,有没有其他方法使activity独立一个栈?

  • 待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,就会创建一个新栈。

(3)何时调用onNewIntent()方法?

  • Activity已经启动过,处于Acrtivity栈中
  • 当launchMode为singleTop时,如果在栈顶,再次启动会调用
  • 当launchMode为singleTask、singleInstance时,如果已经在Activity栈内,再次启动会调用onNewIntent()方法
  • 当launchMode为standard时,不会调用

(4)打开a、b、c后在c中如何关闭a、b

(5)其他:

  1. setResult()必须在finish()之前调用
  2. 多任务栈的情况下,setResult后,前Activity均能拿到消息
  3. ActivityA(standard)-->ActivityB(singleInstance)-->ActivityC(standard)

    此时按back键ActivityC-->ActivityA-->ActivityB

    public class ActivityA extends Activity {//activity代码、b、c基本相同
    private static final String ACTIVITY_NAME = "ActivityA";
    private static final String LOG_TAG = "test_activity_stack"; @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_btn);
    refreshTask();
    findViewById(R.id.btn_task).setOnClickListener(v -> startActivity(new Intent(this, ActivityB.class)));
    } @Override
    protected void onDestroy() {
    super.onDestroy();
    refreshTask();
    } private void refreshTask() {
    int taskId = getTaskId();
    Log.i(LOG_TAG, ACTIVITY_NAME + "所在的任务的id为: " + taskId);
    ((TextView) findViewById(R.id.tv_task)).setText(LOG_TAG + " " + ACTIVITY_NAME + "所在的任务的id为: " + taskId);
    }
    }

    如上图三个Activity分别设置standard、singleInstance、standard;运行起来的结果

    可以看到,A在任务栈4973启动B,启动了一个任务栈4974;启动C又回到了4973;

    以此点击back键退出

    首先从C回到A,再之后回到4974任务栈的B(如果A、C所在的4973仍有其他activity,会一直退到栈空才会回到B)

  4. startActivityForResult打开单独进程的Acitivity,启动模式将不起作用。在情况3中,按back键ActivityC-->ActivityB-->ActivityA,两任务在同一任务栈中;换言之,进程与任务栈没有必然关系

【activity任务栈】浅析的更多相关文章

  1. Android群英传》读书笔记 (4) 第八章 Activity和Activity调用栈分析 + 第九章 系统信息与安全机制 + 第十章 性能优化

    第八章 Activity和Activity调用栈分析 1.Activity生命周期理解生命周期就是两张图:第一张图是回字型的生命周期图第二张图是金字塔型的生命周期图 注意点(1)从stopped状态重 ...

  2. 第四章 Activity和Activity调用栈分析 系统信息与安全机制 性能优化

    1.Activity生命周期理解生命周期就是两张图:第一张图是回字型的生命周期图第二张图是金字塔型的生命周期图 注意点(1)从stopped状态重新回到前台状态的时候会先调用onRestart方法,然 ...

  3. KEILC51可重入函数及模拟栈浅析

    MARK:文章中的红色部分是个人的理解. KEILC51可重入函数及模拟栈浅析 关键字:keilc51,模拟堆栈,可重入函数调用,参数传递,C?XBP,C?ADDXBP 摘要:本文较详细的介绍了kei ...

  4. Android群英传笔记——第八章:Activity与Activity调用栈分析

    Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命 ...

  5. ActivityJump+ActivityManager【Activity之间的跳转和Activity任务栈管理】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装Activity跳转的方法以及实现Activity任务栈管理. 效果图   代码分析 ActivityJump:封装Activi ...

  6. Intent 的Flag属性(Activity在栈位置的主宰者)

    Intent 的Flag属性可用来控制Activity在栈中的排列位置,本文列举了常见的Flag. 例--(以无动画方式启动ActivityB): Intent intent=new Intent(A ...

  7. Android零基础入门第77节:Activity任务栈和启动模式

    通过前面的学习,Activity的基本使用都已掌握,接下来一起来学习更高级的一些内容. Android采用任务栈(Task)的方式来管理Activity的实例.当启动一个应用时,Android就会为之 ...

  8. Android组件内核之Activity调用栈分析(一)

    阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680 导语 我们陈述一下Activity,Activity是整个应用用户交互的 ...

  9. 使用adb shell dumpsys检测Android的Activity任务栈

    谈起Android程序开发,就需要了解其四个主要的部件:Activity.Service.ContentProvider. BroadcastReceiver.而其中Activity是唯一直接控制程序 ...

随机推荐

  1. Python 时间模块

    模块分类 标准库 python解释器自带的, sys, os等 开源模块 比如selenium中的测试框架 自定义模块 比如自己封装的测试框架 时间格式 时间戳 当前时间减去1970年1月1日00:0 ...

  2. java 中 一个int类型的num,num&1

    n&1 把n与1按位与,因为1除了最低位,其他位都为0,所以按位与结果取决于n最后一位,如果n最后一位是1,则结果为1.反之结果为0.(n&1)==1: 判断n最后一位是不是1(可能用 ...

  3. 安卓---RedioButton(单选按钮)、CheckBox(复选按钮)

    <RadioGroup android:layout_width="fill_parent" android:layout_height="wrap_content ...

  4. bzoj 2759一个动态树好题

    真的是动态树好题,如果把每个点的父亲设成p[x],那么建出来图应该是一个环套树森林,拆掉一条边,就变成了动态树,考虑维护什么,对于LCT上每个节点,维护两组k和b,一组是他到他父亲的,一组是他LCT子 ...

  5. BZOJ_3238_[Ahoi2013]差异_后缀自动机

    BZOJ_3238_[Ahoi2013]差异_后缀自动机 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sam ...

  6. python 模块之lxml 防xss攻击

    Use lxml.html.clean! It's VERY easy! from lxml.html.clean import clean_html print clean_html(html) S ...

  7. Arduino入门笔记(6):温度传感器及感温杯实验

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino板 :https://item.taob ...

  8. 一名合格的Web安全工程师之成长路径

    最近经常听到公司的招聘专员反馈应聘者简历“水分”太大,尤其是技术岗位,例如Web安全工程师,明明是初级阶段的菜鸟,就敢写资深Web安全工程师:在几个项目做一些基础打杂的工作,就敢写带过团队,项目经验丰 ...

  9. 已实现乐观锁功能,FreeSql.DbContext 准备起航

    上回说到 FreeSql.DbContext 的规则,以及演示它的执行过程,可惜当时还不支持"乐观锁",对于更新数据来讲并不安全. FreeSql 核心库 v0.3.27 已提供乐 ...

  10. windows代码,传入文件名,遍历此目录下所有文件.

    #include <windows.h> #include <vector> using namespace std; BOOL IterAtorFileSaveFile(IN ...