Android 11 About SleepToken / (Settings)Screen timeout

2024-08-30 18:12

本文主要是介绍Android 11 About SleepToken / (Settings)Screen timeout,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android R 激活Settings里面的息屏休眠, 最前台运行的Activity生命周期 ->onPause->onStop

adb shell dumpsys window policy //获取PhoneWindowManager的dump信息...
bootCompleted=true
screenState=SCREEN_STATE_ON /SCREEN_STATE_OFF
interactiveState=INTERACTIVE_STATE_AWAKE /INTERACTIVE_STATE_SLEEP
...
case A.不使用屏保

当设备超过设定的时间后,进入SCREEN_STATE_OFF状态,最前台运行的Activity生命周期 ->onPause->onStop.
那到底是谁让Activity进入了onStop状态?
跟踪代码发现:

/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java// Called on the DisplayManager's DisplayPowerController thread.@Overridepublic void screenTurnedOff() {if (DEBUG_WAKEUP) Slog.i(TAG, "Screen turned off...");updateScreenOffSleepToken(true);mDefaultDisplayPolicy.screenTurnedOff();synchronized (mLock) {if (mKeyguardDelegate != null) {mKeyguardDelegate.onScreenTurnedOff();}}mDefaultDisplayRotation.updateOrientationListener();reportScreenStateToVrManager(false);}// Called on the DisplayManager's DisplayPowerController thread.@Overridepublic void screenTurningOn(final ScreenOnListener screenOnListener) {if (DEBUG_WAKEUP) Slog.i(TAG, "Screen turning on...");Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "screenTurningOn", 0 /* cookie */);updateScreenOffSleepToken(false);mDefaultDisplayPolicy.screenTurnedOn(screenOnListener);...}   //SCREEN_STATE_OFF 时调用screenTurnedOff(..),这个函数里面有updateScreenOffSleepToken(true)// TODO (multidisplay): Support multiple displays in WindowManagerPolicy.private void updateScreenOffSleepToken(boolean acquire) {if (acquire) {mScreenOffSleepTokenAcquirer.acquire(DEFAULT_DISPLAY);} else {mScreenOffSleepTokenAcquirer.release(DEFAULT_DISPLAY);}}frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java//SleepTokenAcquirer是ActivityTaskManagerService的内部类final class SleepTokenAcquirerImpl implements ActivityTaskManagerInternal.SleepTokenAcquirer {private final String mTag;private final SparseArray<RootWindowContainer.SleepToken> mSleepTokens =new SparseArray<>();SleepTokenAcquirerImpl(@NonNull String tag) {mTag = tag;}@Overridepublic void acquire(int displayId) {synchronized (mGlobalLock) {if (!mSleepTokens.contains(displayId)) {mSleepTokens.append(displayId,mRootWindowContainer.createSleepToken(mTag, displayId));//调用ActivityTaskManagerService的updateSleepIfNeededLocked方法对resume的Activity进行pause        updateSleepIfNeededLocked();}}}@Overridepublic void release(int displayId) {synchronized (mGlobalLock) {final RootWindowContainer.SleepToken token = mSleepTokens.get(displayId);if (token != null) {mRootWindowContainer.removeSleepToken(token);mSleepTokens.remove(displayId);}}}}

1.(息屏)在获取了SleepToken后,会将resume的Activity进入pause状态.如下:

SleepTokenAcquirerImpl::acquire()
--->
RootWindowContainer::createSleepToken()->ActivityTaskManagerService::updateSleepIfNeededLocked()
--->
ActivityStackSupervisor::goingToSleepLocked()
--->
ActivityStackSupervisor::checkReadyForSleepLocked()
--->
RootWindowContainer::putStacksToSleep()
--->
ActivityStack::goToSleepIfPossible()
--->
ActivityStack::startPausingLocked()

2.(亮屏)在释放了SleepToken后,如果此时没有SleepToken了,并且也没有keyguard,会对前台Activity进行resume.

SleepTokenAcquirerImpl::release()
--->
RootWindowContainer::removeSleepToken()
--->
ActivityTaskManagerService::updateSleepIfNeededLocked()
--->
RootWindowContainer::applySleepTokens()
--->
ActivityStack::resumeTopActivityUncheckedLocked()

如果不想设备当前Activity被pause,如下:

+++ b/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -4708,7 +4708,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {public void screenTurnedOff() {if (DEBUG_WAKEUP) Slog.i(TAG, "Screen turned off...");-        updateScreenOffSleepToken(true);
+        //updateScreenOffSleepToken(true);mDefaultDisplayPolicy.screenTurnedOff();synchronized (mLock) {
cast B.使用屏保(com.android.deskclock/android.service.dreams.DreamActivity)

前台Activity —>App A

com.android.deskclock/android.service.dreams.DreamActivity —> App B

App A 被 App B 挤下去了,当前App A不在栈顶(前台)时,App A就会执行on Pause流程

SleepToken
frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
//SleepToken是RootWindowContainer的内部类static final class SleepToken {private final String mTag;private final long mAcquireTime;private final int mDisplayId;final int mHashKey;SleepToken(String tag, int displayId) {mTag = tag;mDisplayId = displayId;mAcquireTime = SystemClock.uptimeMillis();mHashKey = makeSleepTokenKey(mTag, mDisplayId);}@Overridepublic String toString() {return "{\"" + mTag + "\", display " + mDisplayId+ ", acquire at " + TimeUtils.formatUptime(mAcquireTime) + "}";}}

SleepToken机制

这篇关于Android 11 About SleepToken / (Settings)Screen timeout的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121565

相关文章

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式