TaskDisplayArea、ActivityStack、Task以及ActivityRecord之间的关系

news2024/9/22 6:58:38

目录

一、TaskDisplayArea、ActivityStack、TaskRecord以及ActivityRecord关系图

二、TaskDisplayArea、ActivityStack、Task以及ActivityRecord相关代码

1、ActivityRecord

2、Task

3、ActivityStack

4、TaskDisplayArea


前言:对TaskDisplayArea、ActivityStack、TaskRecord以及ActivityRecord这几个类,搞应用开发的同学可能会觉得既熟悉又陌生,有接触但是对他们之间具体的关系只是一知半解,所以我这里整理了一下,方便自己回顾以及同学们的学习。以下基于Android 11讲解,不同Android版本会有差异。

一、TaskDisplayArea、ActivityStack、TaskRecord以及ActivityRecord关系图

先通过框架图直观的画出他们的关系:

我们使用dumpsys activity activities命令查看 activity 相关信息:
 

ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
Display #0 (activities from top to bottom): //(1)
  Stack #33: type=standard mode=fullscreen  //(2)
  isSleeping=false
  mBounds=Rect(0, 0 - 0, 0)
    mResumedActivity: ActivityRecord{42c5293 u0 com.google.android.youtube.tv/com.google.android.apps.youtube.tv.activity.MainActivity t33}
    * Task{abc62c9 #33 visible=true type=standard mode=fullscreen //(3)
translucent=false A=10045:com.google.android.youtube.tv.main U=0 StackId=33 sz=1}
      mBounds=Rect(0, 0 - 0, 0)
      mMinWidth=-1 mMinHeight=-1
      userId=0 effectiveUid=u0a45 mCallingUid=u0a45 mUserSetupComplete=true mCallingPackage=com.google.android.youtube.tv mCallingFeatureId=null
      affinity=10045:com.google.android.youtube.tv.main
      intent={act=android.intent.action.MAIN cat=[android.intent.category.LEANBACK_LAUNCHER] flg=0x15000000 pkg=com.google.android.youtube.tv cmp=com.google.android.yout
ube.tv/com.google.android.apps.youtube.tv.activity.MainActivity}
      mActivityComponent=com.google.android.youtube.tv/com.google.android.apps.youtube.tv.activity.MainActivity
      autoRemoveRecents=false isPersistable=true activityType=1
      rootWasReset=false mNeverRelinquishIdentity=true mReuseTask=false mLockTaskAuth=LOCK_TASK_AUTH_PINNABLE
      Activities=[ActivityRecord{42c5293 u0 com.google.android.youtube.tv/com.google.android.apps.youtube.tv.activity.MainActivity t33}]
      askedCompatMode=false inRecents=true isAvailable=true
      mRootProcess=ProcessRecord{3b66003 2276:com.google.android.youtube.tv/u0a45}
      taskId=33 stackId=33
      mHasBeenVisible=true
      mResizeMode=RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION mSupportsPictureInPicture=false isResizeable=true
      lastActiveTime=936386 (inactive for 56s)
      * Hist #0: ActivityRecord{42c5293 u0 com.google.android.youtube.tv/com.google.android.apps.youtube.tv.activity.MainActivity t33}
          packageName=com.google.android.youtube.tv processName=com.google.android.youtube.tv
          launchedFromUid=10045 launchedFromPackage=com.google.android.youtube.tv launchedFromFeature=null userId=0
          app=ProcessRecord{3b66003 2276:com.google.android.youtube.tv/u0a45}
          Intent { act=android.intent.action.MAIN cat=[android.intent.category.LEANBACK_LAUNCHER] flg=0x15000000 pkg=com.google.android.youtube.tv cmp=com.google.android
.youtube.tv/com.google.android.apps.youtube.tv.activity.MainActivity bnds=[1536,405][1744,554] }
          rootOfTask=true task=Task{abc62c9 #33 visible=true type=standard mode=fullscreen translucent=false A=10045:com.google.android.youtube.tv.main U=0 StackId=33 sz
=1}
          taskAffinity=10045:com.google.android.youtube.tv.main
          mActivityComponent=com.google.android.youtube.tv/com.google.android.apps.youtube.tv.activity.MainActivity
          baseDir=/product/app/YouTubeLeanback/YouTubeLeanback.apk
          dataDir=/data/user/0/com.google.android.youtube.tv
          stateNotNeeded=false componentSpecified=false mActivityType=standard
          compat={320dpi always-compat} labelRes=0x7f12002d icon=0x7f0f0000 theme=0x7f1300de
          mLastReportedConfigurations:
            mGlobalConfig={1.0 ?mcc?mnc [en_US] ldltr sw540dp w960dp h540dp 320dpi lrg long land television finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1920
, 1080) mAppBounds=Rect(0, 0 - 1920, 1080) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0
} s.6}
            mOverrideConfig={1.0 ?mcc?mnc [en_US] ldltr sw540dp w960dp h540dp 320dpi lrg long land television finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 19
20, 1080) mAppBounds=Rect(0, 0 - 1920, 1080) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=standard mAlwaysOnTop=undefined mRotation=ROTATION_
0} s.2}
          CurrentConfiguration={1.0 ?mcc?mnc [en_US] ldltr sw540dp w960dp h540dp 320dpi lrg long land television finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 -
 1920, 1080) mAppBounds=Rect(0, 0 - 1920, 1080) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=standard mAlwaysOnTop=undefined mRotation=ROTATI
ON_0} s.2}
          taskDescription: label="null" icon=null iconResource=/0 iconFilename=null primaryColor=ff282828
            backgroundColor=ff303030 statusBarColor=ff000000 navigationBarColor=ff000000
          launchFailed=false launchCount=1 lastLaunchTime=-56s888ms
          mHaveState=false mIcicle=null
          state=RESUMED stopped=false delayedResume=false finishing=false
          keysPaused=false inHistory=true setToSleep=false idle=true mStartingWindowState=STARTING_WINDOW_SHOWN
          occludesParent=true noDisplay=false immersive=false launchMode=2
          frozenBeforeDestroy=false forceNewConfig=false
          mActivityType=standard
          windows=[Window{287fb2e u0 com.google.android.youtube.tv/com.google.android.apps.youtube.tv.activity.MainActivity}, Window{694a88e u0 com.google.android.youtub
e.tv/com.google.android.apps.youtube.tv.activity.MainActivity}]
          windowType=2 hasVisible=true
          mOccludesParent=true mOrientation=6
          mVisibleRequested=true mVisible=true mClientVisible=true reportedDrawn=true reportedVisible=true
          mNumInterestingWindows=2 mNumDrawnWindows=2 allDrawn=true lastAllDrawn=true)
          startingData=null firstWindowDrawn=true mIsExiting=false
          nowVisible=true lastVisibleTime=-56s184ms
          resizeMode=RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION
          mLastReportedMultiWindowMode=false mLastReportedPictureInPictureMode=false

  Stack #1: type=home mode=fullscreen                                  //(4)
  isSleeping=false
  mBounds=Rect(0, 0 - 0, 0)
    mLastPausedActivity: ActivityRecord{5965cc0 u0 com.google.android.tvlauncher/.MainActivity t30}
    * Task{3d3a13e #30 visible=false type=home mode=fullscreen         //(5)
translucent=true A=10036:.TvLauncher U=0 StackId=1 sz=1}
      mBounds=Rect(0, 0 - 0, 0)
      mMinWidth=-1 mMinHeight=-1
      userId=0 effectiveUid=u0a36 mCallingUid=0 mUserSetupComplete=true mCallingPackage=null mCallingFeatureId=null
      affinity=10036:.TvLauncher
      intent={act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10800100 cmp=com.google.android.tvlauncher/.MainActivity}
      mActivityComponent=com.google.android.tvlauncher/.MainActivity
      autoRemoveRecents=false isPersistable=false activityType=2
      rootWasReset=false mNeverRelinquishIdentity=true mReuseTask=false mLockTaskAuth=LOCK_TASK_AUTH_PINNABLE
      Activities=[ActivityRecord{5965cc0 u0 com.google.android.tvlauncher/.MainActivity t30}]
      askedCompatMode=false inRecents=true isAvailable=true
      taskId=30 stackId=1
      mHasBeenVisible=true
      mResizeMode=RESIZE_MODE_UNRESIZEABLE mSupportsPictureInPicture=false isResizeable=false
      lastActiveTime=931857 (inactive for 61s)
      * Hist #0: ActivityRecord{5965cc0 u0 com.google.android.tvlauncher/.MainActivity t30}
          packageName=com.google.android.tvlauncher processName=com.google.android.tvlauncher
          launchedFromUid=0 launchedFromPackage=null launchedFromFeature=null userId=0
          app=ProcessRecord{14710bd 1297:com.google.android.tvlauncher/u0a36}
          Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10800100 cmp=com.google.android.tvlauncher/.MainActivity (has extras) }       
          rootOfTask=true task=Task{3d3a13e #30 visible=false type=home mode=fullscreen translucent=true A=10036:.TvLauncher U=0 StackId=1 sz=1}
          taskAffinity=10036:.TvLauncher
          mActivityComponent=com.google.android.tvlauncher/.MainActivity
          baseDir=/product/priv-app/TVLauncher/TVLauncher.apk
          dataDir=/data/user/0/com.google.android.tvlauncher
          stateNotNeeded=true componentSpecified=false mActivityType=home
          compat={320dpi always-compat} labelRes=0x7f12002b icon=0x7f0f0000 theme=0x7f130007
          mLastReportedConfigurations:
            mGlobalConfig={1.0 ?mcc?mnc [en_US] ldltr sw540dp w960dp h540dp 320dpi lrg long land television finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1920
, 1080) mAppBounds=Rect(0, 0 - 1920, 1080) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=home mAlwaysOnTop=undefined mRotation=ROTATION_0} s.8
}
            mOverrideConfig={1.0 ?mcc?mnc [en_US] ldltr sw540dp w960dp h540dp 320dpi lrg long land television finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 19
20, 1080) mAppBounds=Rect(0, 0 - 1920, 1080) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=home mAlwaysOnTop=undefined mRotation=ROTATION_0} s
.3}
          CurrentConfiguration={1.0 ?mcc?mnc [en_US] ldltr sw540dp w960dp h540dp 320dpi lrg long land television finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 -
 1920, 1080) mAppBounds=Rect(0, 0 - 1920, 1080) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=home mAlwaysOnTop=undefined mRotation=ROTATION_0
} s.4}
          RequestedOverrideConfiguration={0.0 ?mcc?mnc ?localeList ?layoutDir ?swdp ?wdp ?hdp ?density ?lsize ?long ?ldr ?wideColorGamut ?orien ?uimode ?night ?touch ?ke
yb/?/? ?nav/? winConfig={ mBounds=Rect(0, 0 - 0, 0) mAppBounds=null mWindowingMode=undefined mDisplayWindowingMode=undefined mActivityType=home mAlwaysOnTop=undefined mR
otation=undefined}}
          taskDescription: label="null" icon=null iconResource=/0 iconFilename=null primaryColor=ff37474f
            backgroundColor=ff303030 statusBarColor=ff263238 navigationBarColor=ff000000
          launchFailed=false launchCount=0 lastLaunchTime=-16m8s532ms
          mHaveState=true mIcicle=Bundle[mParcelledData.dataSize=1272]
          state=STOPPED stopped=true delayedResume=false finishing=false
          keysPaused=false inHistory=true setToSleep=false idle=true mStartingWindowState=STARTING_WINDOW_REMOVED
          occludesParent=true noDisplay=false immersive=false launchMode=2
          frozenBeforeDestroy=false forceNewConfig=false
          mActivityType=home
          windows=[Window{eccb3b1 u0 com.google.android.tvlauncher/com.google.android.tvlauncher.MainActivity}]
          windowType=2 hasVisible=true
          mOccludesParent=true mOrientation=0
          mVisibleRequested=false mVisible=false mClientVisible=false reportedDrawn=false reportedVisible=false
          mAppStopped=true
          mNumInterestingWindows=1 mNumDrawnWindows=1 allDrawn=true lastAllDrawn=true)
          startingData=null firstWindowDrawn=true mIsExiting=false
          nowVisible=false lastVisibleTime=-7m58s405ms
          resizeMode=RESIZE_MODE_UNRESIZEABLE
          mLastReportedMultiWindowMode=false mLastReportedPictureInPictureMode=false




根据以上显示的信息,注释(1)中的Display #0 为ActivityDisplay,id为0,注释(2)中的Stack #33 为 ActivityStack,id为33,注释(4)中的Stack #1为ActivityStack,id为1,注释(3)和注释(5)TaskRecord的 id分别为33和30.

 关系图如下:

二、TaskDisplayArea、ActivityStack、Task以及ActivityRecord相关代码

1、ActivityRecord

\frameworks\base\services\core\java\com\android\server\wm\ActivityRecord.java


final class ActivityRecord {
    ...............
    final ActivityRecord.Token appToken;
    final ActivityTaskManagerService mAtmService;
	final ComponentName realActivity;  // the intent component, or target of an alias.
    final String shortComponentName; // the short component name of the intent
    final String packageName; // the package implementing intent's component
    final String processName; // process where this component wants to run
    final String taskAffinity; // as per ActivityInfo.taskAffinity
    boolean fullscreen; // covers the full screen?
    ...............
}

ActivityRecord记录着Activity的信息,与Activity一一对应,可能大家对ActivityRecord与Activity搞不太清楚,实际上ActivityRecord就是Activity对应的服务端,Activity为客户端。

2、Task

\frameworks\base\services\core\java\com\android\server\wm\Task.java

class Task extends WindowContainer<WindowContainer> {
................
 final ActivityTaskManagerService mAtmService;
    final ActivityStackSupervisor mStackSupervisor;
    final RootWindowContainer mRootWindowContainer;

    /* Unique identifier for this task. */
    final int mTaskId;
    /* User for which this task was created. */
    // TODO: Make final
    int mUserId;
................
}

3、ActivityStack

\frameworks\base\services\core\java\com\android\server\wm\ActivityStack.java

class ActivityStack extends Task {
}

 我们可以看到,在Android 11中ActivityStack是继承于task的,因此持有相对应Task中的mAtmService、mStackSupervisor、mRootWindowContainer、mTaskId等变量。通常开启一个新的应用,就会新建一个ActivityStack。但在同一个应用中如果通过singleInstance启动activity,那么也会新建一个ActivityStack。

4、TaskDisplayArea

\frameworks\base\services\core\java\com\android\server\wm\TaskDisplayArea.java

 final class TaskDisplayArea extends DisplayArea<ActivityStack> {
   .....................

    // Cached reference to some special tasks we tend to get a lot so we don't need to loop
    // through the list to find them.
    private ActivityStack mRootHomeTask;
    private ActivityStack mRootPinnedTask;
    private ActivityStack mRootSplitScreenPrimaryTask;

    // TODO(b/159029784): Remove when getStack() behavior is cleaned-up
    private ActivityStack mRootRecentsTask;
   .....................
}

 我们可以看到这里有很多个ActivityStack 的全局变量,mRootHomeTask使用来存储launcher的ActivityStack,其type为home。

\frameworks\base\services\core\java\com\android\server\wm\TaskDisplayArea.java

 ActivityStack getStack(int windowingMode, int activityType) {
.........
        if (activityType == ACTIVITY_TYPE_HOME) { //(6)
            return mRootHomeTask;
        } else if (activityType == ACTIVITY_TYPE_RECENTS) {
            return mRootRecentsTask;
        }
.........
}
 public static String activityTypeToString(@ActivityType int applicationType) {
        switch (applicationType) {
            case ACTIVITY_TYPE_UNDEFINED: return "undefined";
            case ACTIVITY_TYPE_STANDARD: return "standard";
            case ACTIVITY_TYPE_HOME: return "home";  //(7)
            case ACTIVITY_TYPE_RECENTS: return "recents";
            case ACTIVITY_TYPE_ASSISTANT: return "assistant";
            case ACTIVITY_TYPE_DREAM: return "dream";
        }
        return String.valueOf(applicationType);
    }

以上代码我们可以看到通过TaskDisplayArea获取ACTIVITY_TYPE_HOME的时候即返回mRootHomeTask,在注释(7)这里看到其实际type为字符“home”,那么我们回过头看看dumpsys activity activities中launcher相关信息:

 Stack #1: type=home mode=fullscreen                                  //(8)
  isSleeping=false
  mBounds=Rect(0, 0 - 0, 0)
    mLastPausedActivity: ActivityRecord{5965cc0 u0 com.google.android.tvlauncher/.MainActivity t30}
    * Task{3d3a13e #30 visible=false type=home mode=fullscreen         
translucent=true A=10036:.TvLauncher U=0 StackId=1 sz=1}
      mBounds=Rect(0, 0 - 0, 0)
      mMinWidth=-1 mMinHeight=-1
      userId=0 effectiveUid=u0a36 mCallingUid=0 mUserSetupComplete=true mCallingPackage=null mCallingFeatureId=null
      affinity=10036:.TvLauncher
      intent={act=android.intent.action.MAIN cat=[android.intent.category.HOME]

在注释(8)中我们看到其type为home。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1901733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【图解大数据技术】Flume、Kafka、Sqoop

【图解大数据技术】Flume、Kafka、Sqoop FlumeFlume简介Flume的应用场景 KafkaKafka简介Kafka架构Flume与Kafka集成 SqoopSqoop简介Sqoop原理sqoop搭配任务调度器实现定时数据同步 Flume Flume简介 Flume是一个数据采集工具&#xff0c;多用于大数据技术架构下的日志采集。 …

论文略读:Learning and Forgetting Unsafe Examples in Large Language Models

随着发布给公众的大语言模型&#xff08;LLMs&#xff09;数量的增加&#xff0c;迫切需要了解这些模型从第三方定制的微调数据中学习的安全性影响。论文研究了在包含不安全内容的噪声定制数据上微调的LLMs的行为&#xff0c;这些数据集包含偏见、毒性和有害性 发现虽然对齐的L…

尚庭公寓——数据库设计

1. 数据的关系 一对一&#xff0c;一对多&#xff08;多对一&#xff09;&#xff0c;多对多 2. 实体关系模型 实体关系模型常用ER图&#xff08;enity relationship graph&#xff09;表示&#xff1b; 矩形表示实体&#xff08;类似Java中的对象&#xff0c;如学生就是一…

Micron近期发布了32Gb DDR5 DRAM

Micron Technology近期发布了一项内存技术的重大突破——一款32Gb DDR5 DRAM芯片&#xff0c;这项创新不仅将存储容量翻倍&#xff0c;还显著提升了针对人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;、高性能计算&#xff08;HPC&#xff09;以及数…

进程的控制-孤儿进程和僵尸进程

孤儿进程 &#xff1a; 一个父进程退出&#xff0c;而它的一个或多个子进程还在运行&#xff0c;那么那些子进程将成为孤儿进程。孤儿进程将被 init 进程( 进程号为 1) 所收养&#xff0c;并由 init 进程对它们完成状态收集工作 为了释放子进程的占用的系统资源&#xff1a; …

每日一题~ (判断是否是合法的出栈序列)

大概的题意&#xff1a; 将 1-n 按照顺序进栈&#xff0c;问 输入的序列是否是合法的出栈序列。 遍历序列&#xff0c;如果当前这个值a小于 栈顶的值&#xff0c;说明它还未进栈&#xff08;因为我们是按照顺序进栈的&#xff09;&#xff0c;所以我们将 一些元素进栈&#xff…

SpringMVC:SpringMVC执行流程

文章目录 一、介绍二、什么是MVC 一、介绍 Spring MVC 是一种基于Java的Web框架&#xff0c;它采用了MVC&#xff08;Model - View - Controller&#xff09;设计模式&#xff0c;通过吧Model、View和Controller分离&#xff0c;将Web层进行职责解耦&#xff0c;把复杂的Web应…

【C++】解决 C++ 语言报错:Invalid Array Index

文章目录 引言 无效数组索引&#xff08;Invalid Array Index&#xff09;是 C 编程中常见且危险的错误之一。当程序试图使用不合法的索引访问数组时&#xff0c;就会发生无效数组索引错误。这种错误不仅会导致程序崩溃&#xff0c;还可能引发不可预测的行为和安全漏洞。本文将…

MySQL基础篇(二)字符集以及校验规则

在MySQL基础篇&#xff08;一&#xff09;中&#xff0c;我们知道了如何创建数据库&#xff0c;这篇文章带大家了解创建的一些细节。 红色框&#xff1a;可省略&#xff0c;作用如果存在相同的数据库名称&#xff0c;就不会再创建&#xff0c;反之&#xff0c;创建。 蓝色框&…

数据库考试大纲重点总结

考试大纲 第一章 5-10分 10分第二章 5-10分 10分1、计算 除/象集2、连接3、选择4、投影5、代数表达式综合 第三章 20分 20分1、修改表的信息用UPDATE2、创建索引3、有效性检查CHECK 和 缺省值4、数据库表修改SQL语句5、挑选表中的数据赋给中间变量&#xff08;一般用于存储过程…

PyCharm如何安装requirements.txt中的依赖包

问题&#xff1a;下载别人的源码&#xff0c;如何安装代码中requirement.txt中的依赖包。 解决方案&#xff1a; &#xff08;1&#xff09;打开PyCharm下面的Terminal&#xff0c;先为代码创建单独的虚拟环境并进入到虚拟环境中&#xff08;每个项目单独的环境&#xff0c;这…

C++|哈希应用->布隆过滤器

目录 一、概念 二、模拟实现 三、布隆过滤器扩展应用 上一篇章学习了位图的使用&#xff0c;但它只适用于整数&#xff0c;对于要查询字符串是否在不在&#xff0c;位图并不能解决。所以针对这一问题&#xff0c;布隆过滤器可以派上用场&#xff0c;至于布隆过滤器是什么&am…

绝区贰--及时优化降低 LLM 成本和延迟

前言 大型语言模型 (LLM) 为各行各业带来了变革性功能&#xff0c;让用户能够利用尖端的自然语言处理技术处理各种应用。然而&#xff0c;这些强大的 AI 系统的便利性是有代价的 — 确实如此。随着 LLM 变得越来越普及&#xff0c;其计算成本和延迟可能会迅速增加&#xff0c;…

论文回顾 | CVPR 2021 | How to Calibrate Your Event Camera | 基于图像重建的事件相机校准新方法

论文速览 | CVPR 2021 | How to Calibrate Your Event Camera | 基于图像重建的事件相机校准新方法 1 引言 在计算机视觉和机器人领域,相机校准一直是一个基础而又重要的问题。传统的相机校准方法主要依赖于从已知校准图案中提取角点,然后通过优化算法求解相机的内参和外参。这…

以黑盒与白盒的角度分析和通关xss-labs(XSS漏洞类型与总结)

目录 目录 前言 XSS漏洞的总结和梳理 1.第一关(基础palyload) 黑盒测试 白盒测试 2.第二关(闭合) 黑盒测试 白盒测试 3.第三关(字符转义) 黑盒测试 白盒测试 4.第四关(字符过滤或替换) 黑盒测试 白盒测试 5.第五关(关键词替换) 黑盒测试 白盒测试 6.第六关(…

DNS正向解析与反向解析实验

正向解析 安装bind软件 [rootlocalhost ~]# dnf install bind bind-utils -y修改主配置文件/etc/named.conf [rootlocalhost ~]# vim /etc/named.conf重启DNS服务&#xff08;named&#xff09; [rootlocalhost ~]# systemctl restart named编辑数据配置文件。在/var/named…

G2.【C语言】EasyX绘制颜色窗口

1.窗口 窗口&#xff1a;宽度*高度&#xff08;单位都是像素&#xff09; #include <stdio.h> #include <easyx.h> int main() {initgraph(640, 480);getchar();return 0; } 640是宽&#xff0c;480是高 2.操作窗口的三个按钮 #include <stdio.h> #incl…

[FreeRTOS 功能应用] 事件组 功能应用

文章目录 一、基础知识点二、代码讲解三、结果演示四、代码下载 一、基础知识点 [FreeRTOS 基础知识] 事件组 概念 [FreeRTOS 内部实现] 事件组 本实验是基于STM32F103开发移植FreeRTOS实时操作系统&#xff0c;事件组实战操作。(当task1和task2同时完成&#xff0c;才执行ta…

[240706] 史蒂夫·乔布斯近40年前就预言了苹果智能 | Globalping 用于网络诊断和性能测试的命令行工具

目录 史蒂夫.乔布斯近40年前就预言了苹果智能Globalping 用于网络诊断和性能测试的命令行工具功能1. Ping2. Traceroute3. DNS 查询4. HTTP 请求 使用场景1. 网络性能监测2. 故障排除3. 网站性能优化4. 服务可用性监控 优势1. [全球覆盖](https://www.jsdelivr.com/network)2. …

【linux学习---1】点亮一个LED是多么的困难!!!

文章目录 1、原理图找对应引脚2、IO复用3、IO配置4、GPIO配置5、GPIO时钟使能6、总结7、编程8、编译9、链接10、格式转换11、反汇编&#xff08;查看用&#xff09;12、使用Makefile操作13、代码烧写14、代码验证 1、原理图找对应引脚 从上图 可以看出&#xff0c; 蜂鸣器 接到…