上滑动导航栏手势桌面最近任务可见解密-千里马手把手带你搞定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

相关文章

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

Python Invoke自动化任务库的使用

《PythonInvoke自动化任务库的使用》Invoke是一个强大的Python库,用于编写自动化脚本,本文就来介绍一下PythonInvoke自动化任务库的使用,具有一定的参考价值,感兴趣的可以... 目录什么是 Invoke?如何安装 Invoke?Invoke 基础1. 运行测试2. 构建文档3.

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资