返回顶部
首页 > 资讯 > 移动开发 >Android 任务栈机制详解
  • 520
分享到

Android 任务栈机制详解

Android 任务栈机制Android 任务栈 2022-12-19 18:12:16 520人浏览 薄情痞子
摘要

目录1.XML配置的几种方式详解1.1 standard1.2 singleTop1.3 singleTask1.4 singleInstance2.Intent flag启动的几种

1.XML配置的几种方式详解

首先,我们知道,Android有任务栈机制,启动任务栈的方式有xml中配置,还有就是通过intent设置flag去启动相应的activity。这里我们分三部分来介绍 1.xml配置的几种方式详解 2.intent flag启动的几种方式详解 3.flag 与 xml 几种方式的区别和联系

Android开发者在AndroidMainifest文件中一共设计了四种启动模式,如下所示

1.1 standard

默认的启动模式,如果不指定Activity的启动模式,则使用这种方式启动Activity。这种启动模式每次都会创建新的实例,每次点击standard模式创建Activity后,都会创建新的MainActivity覆盖在原Activity上。 实际代码验证 我们实例代码验证一下,新建三个activity,xml中不配置任务栈方式(默认为标准栈),三个activity相互跳转,代码如下:

package com.itbird.task;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import com.itbird.R;
import com.itbird.bitmapOOM.BitmapUtils;
import com.itbird.viewEvent.MyView;
public class MainTestActivity extends AppCompatActivity {
    private static final String TAG = MainTestActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.task_test);
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainTestActivity.this, SecondTestActivity.class);
                startActivity(intent);
            }
        });
    }
    @Override
    protected void onNewIntent(Intent intent) {
        Log.e(TAG, TAG + " onNewIntent");
        super.onNewIntent(intent);
    }
    @Override
    protected void onDestroy() {
        Log.e(TAG, TAG + " onDestroy");
        super.onDestroy();
    }
}

运行之后,跳转顺序为1-2-3-1,通过adb命令查看后台任务栈信息adb shell dumpsys activity activities | grep com.itbird

我们看到后台任务栈,的确是保持为同一个,而且activity实例一直是新建累加的。

1.2 singleTop

如果指定启动Activity为singleTop模式,那么在启动时,系统会判断当前栈顶Activity是不是要启动的Activity,如果是则不创建新的的Activity而直接引用这个Activity;如果不是则创建新的Activity。 实际代码验证 我们在第一个样例的基础代码上,把第三个activity任务栈模式改为singleTop,相同的跳转逻辑,1-2-3-3,运行查看一下任务栈信息

1.3 singleTask

singliTask模式与singleTop模式类似,只不过singleTop是坚持栈顶元素是否是需要启动的Activity,而singleTask是检测整个Activity栈中是否存在需要启动的Activity。如果存在,则将该Activity置于栈顶,并将该Activity以上的Activity都销毁。不过这里是指在同一个App中启动这个singleTask的Activity,如果是其他程序以singleTask模式来启动这个Activity,那么它将创建一个新的任务栈。不过这里有一点需要注意的是,如果启动的模式为singleTask的Activity已经在后台一个任务栈中了,那么启动后,后台的这个任务栈将一起被切换到前台。 实际代码验证 我们在第一个样例的基础代码上,把第一个activity任务栈模式改为singleTask,相同的跳转逻辑,1-2-3-1,运行查看一下任务栈信息

1.4 singleInstance

singleInstance这种模式和使用阅览器工资类似。在多个系统访问阅览器时,如果当前阅览器没有打开,则打开阅览器,否则会在当前打开的阅览器中访问。申明为singleInstance的Activity会出现在一个新的任务栈中,而且这个任务栈只会存在一个Activity。 实际代码验证 我们在第一个样例的基础代码上,把第三个activity任务栈模式改为singleInstance,相同的跳转逻辑,1-2-3-3,运行查看一下任务栈信息

2.Intent flag启动的几种方式详解

2.1 单独使用

  • FLAG_ACTIVITY_NEW_TASK 加上 FLAG_ACTIVITY_NEW_TASK flag 后,启动一个 Activity 时,如果需要创建,被启动的 Activity 会在它需要的栈中创建。如 A 启动 B,B 会在 B 自己需要的栈中被创建(即 taskAffinity 指定的栈)。

我们还是以之前的三个界面的例子,三个界面的xml配置启动栈方式都为标准栈,跳转顺序为1-2-3-1,跳转过程中使用FLAG_ACTIVITY_NEW_TASK flag,代码:

    Intent intent = new Intent(MainTestActivity.this, SecondTestActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

可以看到,在一个任务栈中,即使重新启动1,也是新建实例1,也就是说,这个Flag只是去找寻亲和属性的栈或者新建栈,并不对栈内的实例进行复用、清空等操作。这里看出来了吧,FLAG_ACTIVITY_NEW_TASK != singleTask哦,网上有很多误人子弟的文章,大家还是自己实践出真知吧

  • FLAG_ACTIVITY_CLEAR_TOP 我们还是以之前的三个界面的例子,三个界面的xml配置启动栈方式都为标准栈,跳转顺序为1-2-3-1,跳转过程中使用FLAG_ACTIVITY_CLEAR_TOP flag,代码:
    Intent intent = new Intent(MainTestActivity.this, SecondTestActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);

这时肯定有小伙伴问了,这不就和singleTask一样的效果了吗?我很确定的告诉您,不是哦~~~,clear_top如果检测到栈中有实例存在,会清空栈内包含本身的以上所有activity,我们看一下activity 1的log日志打印就知道了

所以,这里我们知道一个关键点:这里看出来了吧,FLAG_ACTIVITY_CLEAR_TOP != singleTask哦,网上有很多误人子弟的文章,大家还是自己实践出真知吧

  • FLAG_ACTIVITY_SINGLE_TOP 我们还是以之前的三个界面的例子,三个界面的xml配置启动栈方式都为标准栈,跳转顺序为1-2-3-3,跳转过程中使用FLAG_ACTIVITY_SINGLE_TOP flag,代码:
    Intent intent = new Intent(MainTestActivity.this, SecondTestActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);

从这里可以看出,FLAG_ACTIVITY_SINGLE_TOP == singleTop哦

2.2 组合使用

针对于组合使用,我们直接说结论吧,依然是上面的例子,很好验证

  • FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_SINGLE_TOP activity 在前台(当前显示的栈的栈顶),不创建,它自己 onNewIntent 被调用;activity 不在前台的情形下,activity 需要的栈存在,在该栈中创建一个 activity 或将该栈移至前台(它自己 onNewIntent 被调用),activity 需要的栈不存在,创建一个它需要的栈,再创建 activity
  • FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_CLEAR_TOP activity 在它需要的栈里存在,它上面的 activity 会出栈,它自己 finish 后重建 activity 在它需要的栈里不存在,在它需要的栈里创建 所以此处备注:FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_CLEAR_TOP != singleTask
  • FLAG_ACTIVITY_CLEAR_TOP + FLAG_ACTIVITY_SINGLE_TOP activity 在前台(当前显示的栈的栈顶),不创建,它自己 onNewIntent 被调用;activity 不在前台的情形下,activity 在它需要的栈里存在,它上面的 activity 会出栈,它自己 onNewIntent 被调用,activity 在它需要的栈里不存在,在它需要的栈里创建。 所以此处备注:FLAG_ACTIVITY_SINGLE_TOP + FLAG_ACTIVITY_CLEAR_TOP == singleTask

3.flag 与 xml 几种方式的区别和联系

其实相关区别和联系在上面已经基本都说过了,这里用等式简单总结一下: FLAG_ACTIVITY_NEW_TASK != singleTask FLAG_ACTIVITY_CLEAR_TOP != singleTask FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_CLEAR_TOP != singleTask FLAG_ACTIVITY_SINGLE_TOP + FLAG_ACTIVITY_CLEAR_TOP == singleTask FLAG_ACTIVITY_SINGLE_TOP == singleTop 当然这些结论都是基于最初的activity是标准栈的前提,如果将activity最初xml配置改为其他启动栈模式,结论可能有些就发生了一点点的改变。 我们不需要死记硬背这些知识,这些知识点最好各位结合自己的实践Demo验证一波,同时记住一点,FLAG_ACTIVITY_NEW_TASK 只是针对于栈的描述,FLAG_ACTIVITY_CLEAR_TOP 会销毁本身,这就行了。

以上就是Android 任务栈机制详解的详细内容,更多关于Android 任务栈机制的资料请关注编程网其它相关文章!

--结束END--

本文标题: Android 任务栈机制详解

本文链接: https://lsjlt.com/news/175284.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android 任务栈机制详解
    目录1.XML配置的几种方式详解1.1 standard1.2 singleTop1.3 singleTask1.4 singleInstance2.Intent flag启动的几种...
    99+
    2022-12-19
    Android 任务栈机制 Android 任务栈
  • JS堆栈内存的运行机制详解
    目录栈内存 ECStack堆内存数据类型创建步骤在js引擎中对变量的存储主要有两个位置,堆内存和栈内存。栈内存主要用于存储各种基本类型的变量,包括Boolean、Number、Str...
    99+
    2024-04-02
  • 详解Android中AsyncTask机制
    在Android当中,提供了两种方式来解决线程直接的通信问题,一种是通过Handler的机制,还有一种就是今天要详细讲解的 AsyncTask 机制。 AsyncTask&n...
    99+
    2022-06-06
    asynctask Android
  • Android 中Looper机制详解
    版本基于:Android R 0. 前言 在《Android 基于Handler 剖析消息机制》一文中,以 Handler 类为起点详细分析了异步通信,分析了Java 端 Handler 与Looper、MessageQueue、Mes...
    99+
    2023-09-09
    android Looper epoll
  • Android View 绘制机制的详解
    View 绘制机制一、 View 树的绘图流程当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw。整个 View 树...
    99+
    2023-05-31
    android view 绘制
  • Android中的binder机制详解
    目录前言 1、Binder是什么? 2、Android系统框架3、Binder通信 4、Binder框架 5、Binder中使用的设计模式 6、Binder与内存映射mmap 参考文...
    99+
    2024-04-02
  • Android Handler机制详解原理
    Looper是整个跨线程通信的管理者 // 内部持有的变量如下: ThreadLocal<Looper> MainLooper Obs...
    99+
    2024-04-02
  • Android 定时任务过程详解
    在Android开发中,通过以下三种方法定时执行任务: 一、采用Handler与线程的sleep(long)方法(不建议使用,java的实现方式) 二、采用Handler的p...
    99+
    2022-06-06
    定时任务 Android
  • Android的异步任务AsyncTask详解
    AsyncTask,顾名思义,异步任务。说到异步,最简单的理解就是不同步。再复杂一点理解,就得举例子了。 假设我要去火车站买票,刚到火车站我突然发现我忘了带身份证。怎么办?怎么...
    99+
    2022-06-06
    异步 asynctask Android
  • Android中NestedScrolling滑动机制详解
    1,如今NestedScrolling运用到很多地方了,要想好看一点的滑动变换,基本上就是使用这个来完成的,让我们来简单的了解一下。 2,NestedScrolling机制能够...
    99+
    2022-06-06
    Android
  • 详解Android应用沙盒机制
    目录前言一、Android应用DAC沙盒二、Android应用权限三、应用信息的存储四、应用权限的映射五、应用的SELinux标签六、Android应用MAC沙盒前言 Androi...
    99+
    2024-04-02
  • Android IPC机制Messenger实例详解
    Android IPC机制Messenger实例详解前言:Messenger可以翻译成信使,通过它可以在不同进程间传递Message对象有了它就可以轻松实现进程间的数据传递了。Messenger使用的方法相对AIDL比较简单,它对AIDL做...
    99+
    2023-05-30
    android ipc机制 messenger
  • 详解Android Handler 机制 (一)用法全解
    ps:这是关于Android Handler 机制的第一篇文章,主要来说一下Handler的用法,本文尽量归纳完全,如有缺漏,欢迎补充。 Ha...
    99+
    2022-06-06
    handler Android
  • Android View 事件分发机制详解
    Android开发,触控无处不在。对于一些 不咋看源码的同学来说,多少对这块都会有一些疑惑。View事件的分发机制,不仅在做业务需求中会碰到这些问题,在一些面试笔试题中也常有人...
    99+
    2022-06-06
    view 事件 Android
  • Android View事件分发机制详解
    准备了一阵子,一直想写一篇事件分发的文章总结一下,这个知识点实在是太重要了。 一个应用的布局是丰富的,有TextView,ImageView,Button等,这些子View的外...
    99+
    2022-06-06
    view Android
  • Android AIDL——进程通信机制详解
    Android  AIDL, Android进程机制通信机制,这里就整理下AIDL 的知识,帮助大家学习理解此部分知识! 什么是 AIDL AIDL 全称 Andr...
    99+
    2022-06-06
    进程 aidl 通信 Android
  • Android事件的分发机制详解
    在分析Android事件分发机制前,明确android的两大基础控件类型:View和ViewGroup。View即普通的控件,没有子布局的,如Button、TextView. ...
    99+
    2022-06-06
    Android
  • Android事件分发机制的详解
    Android事件分发机制我们只考虑最重要的四个触摸事件,即:DOWN,MOVE,UP和CANCEL。一个手势(gesture)是一个事件列,以一个DOWN事件开始(当用户触摸屏幕时产生),后跟0个或多个MOVE事件(当用户四处移动手指时产...
    99+
    2023-05-30
    android 事件 分发
  • 深入理解JavaScript中的宏任务和微任务机制
    目录引入宏任务与微任务引入 // 开启一个定时器 1秒后执行 setTimeout( () => { console.log(1) }, 1000) console.l...
    99+
    2023-05-18
    JavaScript宏任务 JavaScript微任务
  • JVM学习- - -虚拟机栈详解
    前言:今天学长带领大家走进JVM学习,让我们一起来学习认识虚拟机栈吧~ 目录 1 虚拟机栈概述 虚拟机栈出现的背景 初步印象 内存中的栈和堆 虚拟机栈基本内容 栈的优点 2 栈的存储单位 栈中存储什么? 栈运行原理 栈帧的内部结构 ...
    99+
    2023-09-12
    jvm 学习 java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作