TaskDisplayArea、ActivityStack、Task以及ActivityRecord之間的關系

目錄

一、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=falsemBounds=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=-1userId=0 effectiveUid=u0a45 mCallingUid=u0a45 mUserSetupComplete=true mCallingPackage=com.google.android.youtube.tv mCallingFeatureId=nullaffinity=10045:com.google.android.youtube.tv.mainintent={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.MainActivityautoRemoveRecents=false isPersistable=true activityType=1rootWasReset=false mNeverRelinquishIdentity=true mReuseTask=false mLockTaskAuth=LOCK_TASK_AUTH_PINNABLEActivities=[ActivityRecord{42c5293 u0 com.google.android.youtube.tv/com.google.android.apps.youtube.tv.activity.MainActivity t33}]askedCompatMode=false inRecents=true isAvailable=truemRootProcess=ProcessRecord{3b66003 2276:com.google.android.youtube.tv/u0a45}taskId=33 stackId=33mHasBeenVisible=truemResizeMode=RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION mSupportsPictureInPicture=false isResizeable=truelastActiveTime=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.tvlaunchedFromUid=10045 launchedFromPackage=com.google.android.youtube.tv launchedFromFeature=null userId=0app=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.mainmActivityComponent=com.google.android.youtube.tv/com.google.android.apps.youtube.tv.activity.MainActivitybaseDir=/product/app/YouTubeLeanback/YouTubeLeanback.apkdataDir=/data/user/0/com.google.android.youtube.tvstateNotNeeded=false componentSpecified=false mActivityType=standardcompat={320dpi always-compat} labelRes=0x7f12002d icon=0x7f0f0000 theme=0x7f1300demLastReportedConfigurations: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=ff282828backgroundColor=ff303030 statusBarColor=ff000000 navigationBarColor=ff000000launchFailed=false launchCount=1 lastLaunchTime=-56s888msmHaveState=false mIcicle=nullstate=RESUMED stopped=false delayedResume=false finishing=falsekeysPaused=false inHistory=true setToSleep=false idle=true mStartingWindowState=STARTING_WINDOW_SHOWNoccludesParent=true noDisplay=false immersive=false launchMode=2frozenBeforeDestroy=false forceNewConfig=falsemActivityType=standardwindows=[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=truemOccludesParent=true mOrientation=6mVisibleRequested=true mVisible=true mClientVisible=true reportedDrawn=true reportedVisible=truemNumInterestingWindows=2 mNumDrawnWindows=2 allDrawn=true lastAllDrawn=true)startingData=null firstWindowDrawn=true mIsExiting=falsenowVisible=true lastVisibleTime=-56s184msresizeMode=RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSIONmLastReportedMultiWindowMode=false mLastReportedPictureInPictureMode=falseStack #1: type=home mode=fullscreen                                  //(4)isSleeping=falsemBounds=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=-1userId=0 effectiveUid=u0a36 mCallingUid=0 mUserSetupComplete=true mCallingPackage=null mCallingFeatureId=nullaffinity=10036:.TvLauncherintent={act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10800100 cmp=com.google.android.tvlauncher/.MainActivity}mActivityComponent=com.google.android.tvlauncher/.MainActivityautoRemoveRecents=false isPersistable=false activityType=2rootWasReset=false mNeverRelinquishIdentity=true mReuseTask=false mLockTaskAuth=LOCK_TASK_AUTH_PINNABLEActivities=[ActivityRecord{5965cc0 u0 com.google.android.tvlauncher/.MainActivity t30}]askedCompatMode=false inRecents=true isAvailable=truetaskId=30 stackId=1mHasBeenVisible=truemResizeMode=RESIZE_MODE_UNRESIZEABLE mSupportsPictureInPicture=false isResizeable=falselastActiveTime=931857 (inactive for 61s)* Hist #0: ActivityRecord{5965cc0 u0 com.google.android.tvlauncher/.MainActivity t30}packageName=com.google.android.tvlauncher processName=com.google.android.tvlauncherlaunchedFromUid=0 launchedFromPackage=null launchedFromFeature=null userId=0app=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:.TvLaunchermActivityComponent=com.google.android.tvlauncher/.MainActivitybaseDir=/product/priv-app/TVLauncher/TVLauncher.apkdataDir=/data/user/0/com.google.android.tvlauncherstateNotNeeded=true componentSpecified=false mActivityType=homecompat={320dpi always-compat} labelRes=0x7f12002b icon=0x7f0f0000 theme=0x7f130007mLastReportedConfigurations: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=ff37474fbackgroundColor=ff303030 statusBarColor=ff263238 navigationBarColor=ff000000launchFailed=false launchCount=0 lastLaunchTime=-16m8s532msmHaveState=true mIcicle=Bundle[mParcelledData.dataSize=1272]state=STOPPED stopped=true delayedResume=false finishing=falsekeysPaused=false inHistory=true setToSleep=false idle=true mStartingWindowState=STARTING_WINDOW_REMOVEDoccludesParent=true noDisplay=false immersive=false launchMode=2frozenBeforeDestroy=false forceNewConfig=falsemActivityType=homewindows=[Window{eccb3b1 u0 com.google.android.tvlauncher/com.google.android.tvlauncher.MainActivity}]windowType=2 hasVisible=truemOccludesParent=true mOrientation=0mVisibleRequested=false mVisible=false mClientVisible=false reportedDrawn=false reportedVisible=falsemAppStopped=truemNumInterestingWindows=1 mNumDrawnWindows=1 allDrawn=true lastAllDrawn=true)startingData=null firstWindowDrawn=true mIsExiting=falsenowVisible=false lastVisibleTime=-7m58s405msresizeMode=RESIZE_MODE_UNRESIZEABLEmLastReportedMultiWindowMode=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 intentfinal String packageName; // the package implementing intent's componentfinal String processName; // process where this component wants to runfinal String taskAffinity; // as per ActivityInfo.taskAffinityboolean 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 finalint 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-upprivate 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=falsemBounds=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=-1userId=0 effectiveUid=u0a36 mCallingUid=0 mUserSetupComplete=true mCallingPackage=null mCallingFeatureId=nullaffinity=10036:.TvLauncherintent={act=android.intent.action.MAIN cat=[android.intent.category.HOME]

在注釋(8)中我們看到其type為home。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40575.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40575.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40575.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

go語言day08 泛型 自定義錯誤處理 go:協程

泛型&#xff1a; 拋錯誤異常 實現error接口類型 用java語言解釋的話&#xff0c;實現類需要重寫error類型的抽象方法Error().這樣就可以自定義異常處理。 回到go語言&#xff0c;在Error()方法中用*argError 這樣一個指針類來充當error接口的實現類。 在f2()方法中定義返回值…

CONFIG_FEATURE_MOUNT_NFS

CONFIG_FEATURE_MOUNT_NFS是一個Linux內核配置選項&#xff0c;它允許系統支持掛載NFS文件系統。如果您在編譯內核或構建根文件系統時遇到關于NFS支持的問題&#xff0c;您可能需要檢查這個配置選項是否被啟用。在某些情況下&#xff0c;例如使用BusyBox作為工具集時&#xff0…

漏洞分析|OpenSSH漏洞(CVE-2024-6387)

一、網傳漏洞POC信息 漏洞編號&#xff1a;CVE-2024-6387 漏洞名稱&#xff1a;OpenSSH regreSSHion 漏洞 POC上傳者&#xff08;作者不確定&#xff09;&#xff1a;7etsuo 發布日期&#xff1a;2024-07-01 漏洞類型&#xff1a;遠程代碼執行&#xff08;RCE&#xff09;…

昇思MindSpore學習筆記3-03熱門LLM及其他AI應用--基于MobileNetv2的垃圾分類

摘要&#xff1a; MindSpore AI框架使用MobileNetv2模型開發垃圾分檢代碼。檢測本地圖像中的垃圾物體&#xff0c;保存檢測結果到文件。記錄了開發過程和步驟&#xff0c;包括環境準備、數據下載、加載和預處理、模型搭建、訓練、測試、推理應用等。 1、實驗目的 了解垃圾分…

解決pip默認安裝位置在C盤方法

新版python中使用pip命令將opencv庫安裝到base環境中 首先我們打開命令控制窗口&#xff0c;激活base環境&#xff0c;輸入conda activate base 然后檢查一下自己base環境中是否安裝opencv庫&#xff0c;輸入conda list 往下找&#xff0c;找到o開頭的地方&#xff0c;發現是…

達夢數據庫 頁大小與數據庫字段長度的關系

對于達夢數據庫實例而言&#xff0c;頁大小 (page_size)、簇大小 (extent_size)、大小寫敏感 (case_sensitive)、字符集 (charset) 這四個參數&#xff0c;一旦確定無法修改&#xff1b;如果過程中發現這些數據設置的不對&#xff0c;只能是重新新建數據庫實例&#xff0c;而不…

GraphQL與RESTful API的區別和優勢

GraphQL GraphQL是一種用于API設計的語言和查詢協議&#xff0c;由Facebook于2015年推出。它允許客戶端向服務器指定他們需要的數據字段&#xff0c;而不是像RESTful API那樣請求整個資源然后過濾數據。在GraphQL中&#xff0c;客戶端發送一個單一的請求&#xff0c;而服務器返…

通過npm安裝OpenLayers庫,vue3+ts環境下OpenLayers實現加載本地高德離線地圖并添加標記點、標記點氣泡及標記點氣泡按鈕事件

在Vue 3和TypeScript的環境下使用OpenLayers來加載高德地圖的離線瓦片&#xff0c;并添加標記點、標記點氣泡以及處理氣泡上的按鈕事件&#xff0c;涉及到幾個步驟。首先&#xff0c;需要明確高德地圖的瓦片數據格式和如何配置OpenLayers以使用這些瓦片。接著&#xff0c;我們需…

零信任沙箱是什么?零信任沙箱有什么作用?

零信任沙箱是什么&#xff1f;零信任沙箱有什么作用&#xff1f; 在當今數字化時代&#xff0c;數據安全已成為各行各業的核心關注點。零信任沙箱作為一種新興的安全技術&#xff0c;不僅適用于政府和金融等關鍵領域&#xff0c;其實用性覆蓋了更廣泛的場景&#xff0c;如醫療…

數智化配補調:零售品牌增長新引擎

隨著科技的不斷進步和消費者需求的日益個性化、多元化&#xff0c;傳統服裝行業正面臨著前所未有的挑戰與機遇。在這個快速變化的時代&#xff0c;如何精準把握市場脈搏&#xff0c;實現庫存的高效管理&#xff0c;成為了服裝品牌生存與發展的關鍵。數智化配補調策略應運而生&a…

mysql定時備份數據庫

文章目錄 核心目標思路具體方法一、編寫腳本二、修改文件屬性三、找一個mysqldump文件四、把.sh放到定時器里 其它&#xff1a;windows的腳本 核心目標 解決數據庫定時備份的工作。centos環境。 思路 用centos的crontab定時執行腳本。 具體方法 一、編寫腳本 編寫backup_…

精準控制:Eureka服務續約間隔配置全指南

精準控制&#xff1a;Eureka服務續約間隔配置全指南 在微服務架構中&#xff0c;服務的發現與注冊是確保服務間有效通信的關鍵。Eureka&#xff0c;作為Netflix開源的服務發現框架&#xff0c;提供了一種優雅的方式來實現服務的注冊與發現。然而&#xff0c;服務續約間隔的配置…

vue單獨部署到寶塔教程

配置反向代理 注意:如果目標網站是https則寫https否則寫http 2.關于解決部署后無法刷新,直接報錯404 location / { try_files $uri $uri/ /index.html; }

程序員魚皮的保姆級寫簡歷指南第三彈,簡歷常見問題和建議匯總

大家好&#xff0c;我是程序員魚皮。做知識分享這些年來&#xff0c;我看過太多簡歷、也幫忙修改過很多的簡歷&#xff0c;發現很多同學是完全不會寫簡歷的、會犯很多常見的問題&#xff0c;不能把自己的優勢充分展示出來&#xff0c;導致錯失了很多面試機會&#xff0c;實在是…

PostgreSQL LIMIT 子句

PostgreSQL LIMIT 子句 PostgreSQL 是一種功能強大的開源對象關系數據庫管理系統&#xff0c;廣泛用于各種應用中。在處理大量數據時&#xff0c;我們通常只需要檢索部分記錄&#xff0c;而不是整個數據集。這時&#xff0c;LIMIT 子句就變得非常有用。本文將詳細介紹 Postgre…

代碼隨想錄Day74(圖論Part10)

94. 城市間貨物運輸| &#xff08;Bellman_ford隊列優化版 / SPFA&#xff09; 題目&#xff1a;94. 城市間貨物運輸 I (kamacoder.com) 思路&#xff1a; Bellman_ford 算法 每次都是對所有邊進行松弛&#xff0c;其實是多做了一些無用功。 只需要對 上一次松弛的時候更新過的…

p6spy 組件打印完整的 SQL 語句、執行耗時

一、前言 我們來配置一下 Mybatis Plus 打印 SQL 功能&#xff08;包括執行耗時&#xff09;&#xff0c;一方面可以了解到每個操作都具體執行的什么 SQL 語句&#xff0c; 另一方面通過打印執行耗時&#xff0c;也可以提前發現一些慢 SQL&#xff0c;提前做好優化&#xff0c…

layui中添加上下文提示彈窗

<p context-tip"自定義上下文提示信息">段落內容...</p> <div context-tip"自定義上下文提示信息">div內容...</div>// 懸浮提示 $("body").on("mouseenter", "*[context-tip]", function () {v…

操作系統僵尸進程、CFS、上下文切換

進程 Linux的進程調度 CFS 完全公平調度算法 權重和nice值 權重&#xff1a;權重越大&#xff0c;分配的時間比例越大&#xff0c;就相當于進程的優先級越高。 進程的時間 C P U 總時間 ? 進程的權重 / 就緒隊列所有進程權重之和 進程的時間 CPU總時間 * 進程的權重/就緒…

電腦鼠標一直轉圈圈怎么處理?對癥下藥,分享6種方法

在使用電腦的過程中&#xff0c;鼠標一直轉圈圈是一個常見且令人困擾的問題。這種情況通常意味著系統正在處理某些任務&#xff0c;但如果持續時間過長&#xff0c;可能表明系統存在性能問題或錯誤。本文將詳細探討鼠標一直轉圈圈的常見原因及其解決方法。 摘要 電腦鼠標一直轉…