上滑动导航栏手势桌面最近任务可见解密-千里马手把手带你搞定framework车载车机系统开发

本文主要是介绍上滑动导航栏手势桌面最近任务可见解密-千里马手把手带你搞定framework车载车机系统开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

建议先看另一篇blog:
https://blog.csdn.net/learnframework/article/details/123032419

在这里插入图片描述

系统如何让桌面执行对应的onStart方法呢?

具体的堆栈显示如下:

makeActiveIfNeeded:5788, ActivityRecord (com.android.server.wm)
makeVisibleIfNeeded:5697, ActivityRecord (com.android.server.wm)
setActivityVisibilityState:210, EnsureActivitiesVisibleHelper (com.android.server.wm)
process:143, EnsureActivitiesVisibleHelper (com.android.server.wm)
updateActivityVisibilities:1117, TaskFragment (com.android.server.wm)
lambda$ensureActivitiesVisible$18:4857, Task (com.android.server.wm)
accept:-1, Task$$ExternalSyntheticLambda23 (com.android.server.wm)
forAllLeafTasks:3174, Task (com.android.server.wm)
forAllLeafTasks:3162, Task (com.android.server.wm)
ensureActivitiesVisible:4856, Task (com.android.server.wm)
lambda$ensureActivitiesVisible$45:6293, DisplayContent (com.android.server.wm)
accept:-1, DisplayContent$$ExternalSyntheticLambda38 (com.android.server.wm)
forAllRootTasks:3186, Task (com.android.server.wm)
forAllRootTasks:2014, WindowContainer (com.android.server.wm)
forAllRootTasks:2014, WindowContainer (com.android.server.wm)
forAllRootTasks:2014, WindowContainer (com.android.server.wm)
forAllRootTasks:2014, WindowContainer (com.android.server.wm)
forAllRootTasks:2014, WindowContainer (com.android.server.wm)
forAllRootTasks:2014, WindowContainer (com.android.server.wm)
forAllRootTasks:2007, WindowContainer (com.android.server.wm)
ensureActivitiesVisible:6292, DisplayContent (com.android.server.wm)
ensureActivitiesVisible:1864, RootWindowContainer (com.android.server.wm)
ensureActivitiesVisible:1845, RootWindowContainer (com.android.server.wm)
startRecentsActivity:260, RecentsAnimation (com.android.server.wm)
startRecentsActivity:1729, ActivityTaskManagerService (com.android.server.wm)
onTransact:1171, IActivityTaskManager$Stub (android.app)
onTransact:5183, ActivityTaskManagerService (com.android.server.wm)
execTransactInternal:1280, Binder (android.os)
execTransact:1244, Binder (android.os)

导致onStart调用关键就在于这里的startRecentsActivity会触发ensureActivitiesVisible方法,正常的ensureActivitiesVisible只是来保证当前一些ActivityRecord的属性值或者config变化了,靠调用ensureActivitiesVisible来保证Activity的visibility可以显示正常
在这里插入图片描述

这里的
targetActivity.mLaunchTaskBehind = true;
就是最为关键的点,它代表者可以在其他activity的后面可以显示。

疑问为啥只是到了onStart而不走到onResume:

根据上面的堆栈来看这个核心方法makeActiveIfNeeded

boolean makeActiveIfNeeded(ActivityRecord activeActivity) {
//判断Activity是应该被Resumeif (shouldResumeActivity(activeActivity)) {return getRootTask().resumeTopActivityUncheckedLocked(activeActivity /* prev */,null /* options */);} else if (shouldPauseActivity(activeActivity)) {
//判断Activity是应该被PasuesetState(PAUSING, "makeActiveIfNeeded");mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), token,PauseActivityItem.obtain(finishing, false /* userLeaving */,configChangeFlags, false /* dontReport */));} else if (shouldStartActivity()) {setState(STARTED, "makeActiveIfNeeded");try {mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), token,StartActivityItem.obtain(takeOptions()));} mTaskSupervisor.mStoppingActivities.remove(this);}return false;}

那么这里其实最主要我们关注是shouldResumeActivity(activeActivity)方法为啥没有返回true,而返回来false,导致进入到了shouldStartActivity方法
看看shouldResumeActivity方法:

  @VisibleForTestingboolean shouldResumeActivity(ActivityRecord activeActivity) {//主要调用到了shouldBeResumedreturn shouldBeResumed(activeActivity) && !isState(RESUMED);}private boolean shouldBeResumed(ActivityRecord activeActivity) {//shouldBeResumed方法又有若干条件,任何条件不满足都是不可以的,先看看第一个条件shouldMakeActivereturn shouldMakeActive(activeActivity) && isFocusable()&& getTaskFragment().getVisibility(activeActivity)== TASK_FRAGMENT_VISIBILITY_VISIBLE&& canResumeByCompat();}boolean shouldMakeActive(ActivityRecord activeActivity) {if (!isState(STARTED, RESUMED, PAUSED, STOPPED, STOPPING)// TODO (b/185876784) Check could we remove the check condition//  mTranslucentActivityWaiting != null here|| getRootTask().mTranslucentActivityWaiting != null) {return false;}if (this == activeActivity) {return false;}if (!mTaskSupervisor.readyToResume()) {// Making active is currently deferred (e.g. because an activity launch is in progress).return false;}
//核心就是这个地方,前面设置了mLaunchTaskBehind为true,所以这里就返回false了if (this.mLaunchTaskBehind) {// This activity is being launched from behind, which means that it's not intended to be// presented to user right now, even if it's set to be visible.return false;}return getTaskFragment().topRunningActivity() == this;}

这篇关于上滑动导航栏手势桌面最近任务可见解密-千里马手把手带你搞定framework车载车机系统开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Python Flask实现定时任务的不同方法详解

《PythonFlask实现定时任务的不同方法详解》在Flask中实现定时任务,最常用的方法是使用APScheduler库,本文将提供一个完整的解决方案,有需要的小伙伴可以跟随小编一起学习一下... 目录完js整实现方案代码解释1. 依赖安装2. 核心组件3. 任务类型4. 任务管理5. 持久化存储生产环境

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1