Launcher对RecentView展示TaskView详细分析-android framework车载车机手机系统开发

Android12 车载开发TaskView实现分屏 这里只给出TaskView的代码,相关联的源码,请看源码,如果想要使用TaskView需要自己去编译frameWork的源码,打包一个aar,或者jar出来使用,否则无法直接使用。1.如果分屏的应用如启动两个应用按照权重占比,互相不叠加在一起,点触摸击事件都可响应,例如左边启动QQ了,右边启动的是微信,二者窗口都可操作。TaskView是谷歌整合安卓多任务多窗口下交互重新重构的独立出来的module,本身继承自ServiceView,TaskView的相关概念性的东西参考。//创建的taskview。 阅读详情
AI摘要

该文详细阐述了Android系统中TaskView的创建过程,涉及到ViewPool的使用以减少频繁创建,以及如何通过RecentsView.getTaskViewFromPool方法从缓存中获取。调用链始于RecentsModel.getTasks,经过RecentTasksList和RecentsView,直到最终的TaskLoadResult.loadTasksInBackground。此外,还讨论了如何通过sysui和ActivityTaskManager获取RecentTaskInfo,以及TaskThumbnailView设置缩略图的过程。

TaskView创建的堆栈调用:

b站免费视频教程讲解:
https://www.bilibili.com/video/BV1wj411o7A9/
在这里插入图片描述
TaskView的创建调用栈:
在这里插入图片描述

实际上这里创建的调用栈是,但是这里明显使用的ViewPool这种方式,主要是为了减少频繁创建的,所以就干脆缓存到ViewPool中,需要用时候再拿出来

什么时候到ViewPool中获取呢?具体获取调用链如下:

07-29 17:50:08.170  1065  1065 I lsm444  : java.lang.Exception
07-29 17:50:08.170  1065  1065 I lsm444  : 	at com.android.quickstep.views.RecentsView.getTaskViewFromPool(RecentsView.java:2085)
07-29 17:50:08.170  1065  1065 I lsm444  : 	at com.android.quickstep.views.RecentsView.applyLoadPlan(RecentsView.java:1443)
07-29 17:50:08.170  1065  1065 I lsm444  : 	at com.android.quickstep.views.RecentsView$$ExternalSyntheticLambda19.accept(Unknown Source:4)
07-29 17:50:08.170  1065  1065 I lsm444  : 	at com.android.quickstep.RecentTasksList.lambda$getTasks$3$com-android-quickstep-RecentTasksList(RecentTasksList.java:132)
07-29 17:50:08.170  1065  1065 I lsm444  : 	at com.android.quickstep.RecentTasksList$$ExternalSyntheticLambda4.run(Unknown Source:6)
07-29 17:50:08.170  1065  1065 I lsm444  : 	at android.os.Handler.handleCallback(Handler.java:942)
07-29 17:50:08.170  1065  1065 I lsm444  : 	at android.os.Handler.dispatchMessage(Handler.java:99)
07-29 17:50:08.170  1065  1065 I lsm444  : 	at android.os.Looper.loopOnce(Looper.java:201)
07-29 17:50:08.170  1065  1065 I lsm444  : 	at android.os.Looper.loop(Looper.java:288)
07-29 17:50:08.170  1065  1065 I lsm444  : 	at android.app.ActivityThread.main(ActivityThread.java:7898)
07-29 17:50:08.170  1065  1065 I lsm444  : 	at java.lang.reflect.Method.invoke(Native Method)
07-29 17:50:08.170  1065  1065 I lsm444  : 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
07-29 17:50:08.170  1065  1065 I lsm444  : 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

上面可以看出主要是通过RecentsView.applyLoadPlan方法,这个其实是从getTasks这个方法里面进行调用的

    public synchronized int getTasks(boolean loadKeysOnly,
            Consumer<ArrayList<GroupTask>> callback) {
      //省略
        UI_HELPER_EXECUTOR.execute(() -> {
            if (!mResultsBg.isValidForRequest(requestLoadId, loadKeysOnly)) {
                mResultsBg = loadTasksInBackground(Integer.MAX_VALUE, requestLoadId, loadKeysOnly);
            }
            TaskLoadResult loadResult = mResultsBg;
            mMainThreadExecutor.execute(() -> {

                if (callback != null) {
                    ArrayList<GroupTask> result = copyOf(mResultsUi);
                    callback.accept(result);//这里进行的调用applyLoadPlan
                }
            });
        });

        return requestLoadId;
    }

那么又是哪里调用到的getTasks这个方法呢?
getTask的调用链如下:


07-29 17:50:08.161  1065  1065 I lsm444  : getTasks 
07-29 17:50:08.161  1065  1065 I lsm444  : java.lang.Exception
07-29 17:50:08.161  1065  1065 I lsm444  : 	at com.android.quickstep.RecentTasksList.getTasks(RecentTasksList.java:119)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at com.android.quickstep.RecentsModel.getTasks(RecentsModel.java:102)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at com.android.quickstep.views.RecentsView.reloadIfNeeded(RecentsView.java:2103)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at com.android.quickstep.views.RecentsView.updateTaskStackListenerState(RecentsView.java:1634)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at com.android.quickstep.views.RecentsView.setOverviewStateEnabled(RecentsView.java:1178)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at com.android.quickstep.views.LauncherRecentsView.setOverviewStateEnabled(LauncherRecentsView.java:133)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at com.android.quickstep.views.LauncherRecentsView.onStateTransitionStart(LauncherRecentsView.java:100)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at com.android.quickstep.views.LauncherRecentsView.onStateTransitionStart(LauncherRecentsView.java:49)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at com.android.launcher3.statemanager.StateManager.onStateTransitionStart(StateManager.java:353)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at com.android.launcher3.statemanager.StateManager.-$$Nest$monStateTransitionStart(Unknown Source:0)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at com.android.launcher3.statemanager.StateManager$1.onAnimationStart(StateManager.java:338)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at android.animation.Animator$AnimatorListener.onAnimationStart(Animator.java:584)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at android.animation.AnimatorSet.start(AnimatorSet.java:737)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at android.animation.AnimatorSet.start(AnimatorSet.java:684)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at com.android.launcher3.statemanager.StateManager$StartAnimRunnable.run(StateManager.java:503)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at android.os.Handler.handleCallback(Handler.java:942)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at android.os.Handler.dispatchMessage(Handler.java:99)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at android.os.Looper.loopOnce(Looper.java:201)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at android.os.Looper.loop(Looper.java:288)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at android.app.ActivityThread.main(ActivityThread.java:7898)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at java.lang.reflect.Method.invoke(Native Method)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
07-29 17:50:08.161  1065  1065 I lsm444  : 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

TaskInfo相关的数据加载:

  /**
     * Loads and creates a list of all the recent tasks.
     */
    @VisibleForTesting
    TaskLoadResult loadTasksInBackground(int numTasks, int requestId, boolean loadKeysOnly) {
        int currentUserId = Process.myUserHandle().getIdentifier();
        //调用到sysui端的getRecentTasks
        ArrayList<GroupedRecentTaskInfo> rawTasks =
                mSysUiProxy.getRecentTasks(numTasks, currentUserId);
      //省略

        return allTasks;
    }


这里其实会调用的sysui的getRecentTasks进行查询
这里其实是一个跨进程通信:
frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java

 private static class IRecentTasksImpl extends IRecentTasks.Stub {
       //省略
        @Override
        public GroupedRecentTaskInfo[] getRecentTasks(int maxNum, int flags, int userId)
//省略
这里核心又调用到了controller的getRecentTasks
            executeRemoteCallWithTaskPermission(mController, "getRecentTasks",
                    (controller) -> out[0] = controller.getRecentTasks(maxNum, flags, userId)
                            .toArray(new GroupedRecentTaskInfo[0]),
                    true /* blocking */);
            return out[0];
        }
    }

@VisibleForTesting
    ArrayList<GroupedRecentTaskInfo> getRecentTasks(int maxNum, int flags, int userId) {
        // Note: the returned task list is from the most-recent to least-recent order
        //调用到了getRawRecentTasks方法
        final List<ActivityManager.RecentTaskInfo> rawList = getRawRecentTasks(maxNum, flags,
                userId);

        //以下操作主要是为了分屏相关的task可以作为一个整体返回,一般把它们搞成一个gouped,有task1和task2
        
        // Pull out the pairs as we iterate back in the list
        ArrayList<GroupedRecentTaskInfo> recentTasks = new ArrayList<>();
        for (int i = 0; i < rawList.size(); i++) {
            final ActivityManager.RecentTaskInfo taskInfo = rawList.get(i);
            if (!rawMapping.contains(taskInfo.taskId)) {
                // If it's not in the mapping, then it was already paired with another task
                continue;
            }

            final int pairedTaskId = mSplitTasks.get(taskInfo.taskId);
            if (pairedTaskId != INVALID_TASK_ID && rawMapping.contains(pairedTaskId)) {
                final ActivityManager.RecentTaskInfo pairedTaskInfo = rawMapping.get(pairedTaskId);
                rawMapping.remove(pairedTaskId);
                recentTasks.add(new GroupedRecentTaskInfo(taskInfo, pairedTaskInfo,
                        mTaskSplitBoundsMap.get(pairedTaskId)));
            } else {
                recentTasks.add(new GroupedRecentTaskInfo(taskInfo));
            }
        }
        return recentTasks;
    }
    
   @VisibleForTesting
    List<ActivityManager.RecentTaskInfo> getRawRecentTasks(int maxNum, int flags, int userId) {
    //本质就是调用到了atms的getRecentTasks方法
        return ActivityTaskManager.getInstance().getRecentTasks(maxNum, flags, userId);
    }

上面获取RecentTask的信息就已经完成,总结一下:
1、桌面调用到sysui获取Task信息,因为sysui中其实有分屏相关的TecentTask信息
2、sysui也是调用到atms进行RecentTask的信息获取

缩略图设置解析:

07-30 00:56:38.758  1059  1059 I lsm444  : setThumbnail task = [id=16 windowingMode=0 user=0 lastActiveTime=18031] null thumbnailData = com.android.systemui.shared.recents.model.ThumbnailData@57b6fdb
07-30 00:56:38.758  1059  1059 I lsm444  : java.lang.Exception
07-30 00:56:38.758  1059  1059 I lsm444  : 	at com.android.quickstep.views.TaskThumbnailView.setThumbnail(TaskThumbnailView.java:150)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at com.android.quickstep.views.TaskThumbnailView.setThumbnail(TaskThumbnailView.java:162)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at com.android.quickstep.views.TaskView.lambda$onTaskListVisibilityChanged$5$com-android-quickstep-views-TaskView(TaskView.java:819)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at com.android.quickstep.views.TaskView$$ExternalSyntheticLambda3.accept(Unknown Source:4)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at com.android.quickstep.TaskThumbnailCache.lambda$updateThumbnailInBackground$1(TaskThumbnailCache.java:147)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at com.android.quickstep.TaskThumbnailCache$$ExternalSyntheticLambda0.accept(Unknown Source:6)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at com.android.quickstep.TaskThumbnailCache$1.handleResult(TaskThumbnailCache.java:173)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at com.android.quickstep.TaskThumbnailCache$1.handleResult(TaskThumbnailCache.java:163)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at com.android.quickstep.util.CancellableTask.lambda$run$0$com-android-quickstep-util-CancellableTask(CancellableTask.java:43)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at com.android.quickstep.util.CancellableTask$$ExternalSyntheticLambda0.run(Unknown Source:4)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at android.os.Handler.handleCallback(Handler.java:942)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at android.os.Looper.loopOnce(Looper.java:201)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at android.os.Looper.loop(Looper.java:288)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at android.app.ActivityThread.main(ActivityThread.java:7898)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at java.lang.reflect.Method.invoke(Native Method)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
07-30 00:56:38.758  1059  1059 I lsm444  : 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

设置相关的缩略图由以下代码触发:

  public void onTaskListVisibilityChanged(boolean visible, @TaskDataChanges int changes) {
     
        if (visible) {
            // These calls are no-ops if the data is already loaded, try and load the high
            // resolution thumbnail if the state permits
            RecentsModel model = RecentsModel.INSTANCE.get(getContext());
            TaskThumbnailCache thumbnailCache = model.getThumbnailCache();
            TaskIconCache iconCache = model.getIconCache();

            if (needsUpdate(changes, FLAG_UPDATE_THUMBNAIL)) {
            //这里进行相关加载缩略图加载
                mThumbnailLoadRequest = thumbnailCache.updateThumbnailInBackground(
                        mTask, thumbnail -> {
                        //加载完成后进行回调
                            mSnapshotView.setThumbnail(mTask, thumbnail);
                        });
            }
           //省略
    }

接下来看updateThumbnailInBackground方法:

    public CancellableTask updateThumbnailInBackground(
            Task task, Consumer<ThumbnailData> callback) {
        Preconditions.assertUIThread();
//省略
        return updateThumbnailInBackground(task.key, !mHighResLoadingState.isEnabled(), t -> {
        //加在完成后的回调有
            task.thumbnail = t;
            callback.accept(t);
        });
    }

再来看看updateThumbnailInBackground方法实现:


    private CancellableTask updateThumbnailInBackground(TaskKey key, boolean lowResolution,
            Consumer<ThumbnailData> callback) {
        Preconditions.assertUIThread();

        ThumbnailData cachedThumbnail = mCache.getAndInvalidateIfModified(key);
        if (cachedThumbnail != null &&  cachedThumbnail.thumbnail != null
                && (!cachedThumbnail.reducedResolution || lowResolution)) {
            // Already cached, lets use that thumbnail
            callback.accept(cachedThumbnail);
            return null;
        }

        CancellableTask<ThumbnailData> request = new CancellableTask<ThumbnailData>() {
            @Override
            public ThumbnailData getResultOnBg() {
            //最终其实是通过传递taskId到ams中获取对应的缩略图
                return ActivityManagerWrapper.getInstance().getTaskThumbnail(
                        key.id, lowResolution);
            }

            @Override
            public void handleResult(ThumbnailData result) {
                mCache.put(key, result);
                callback.accept(result);
            }
        };
        mBgExecutor.execute(request);
        return request;
    }

TaskView TaskView是AOSP提供给系统开发者的一个强大工具,用于实现真正的“应用内嵌应用”。它通过系统服务在底层创建一个独立但视觉上融合的任务栈,完美地解决了跨进程窗口管理的复杂性。如果你的角色是系统应用开发者(例如在为设备制造商工作),需要实现分屏、自由窗口或复杂的应用切换界面,那么深入理解并使用TaskView将是关键。对于普通应用开发者而言,了解其存在和原理有助于理解Android系统UI的工作机制,但无法直接在自己的应用中使用它。 阅读详情

相关推荐

Android 11多窗口+分屏+APP窗口嵌套TaskView实现原理一

然而随着版本的迭代升级,google对分屏的定制差异化也越来越大,Androd 11的分屏用的是split-screen-primary和split-screen-secondary的方式,在systemui中去实现的,其定制化的灵活度不是很高,很多业务都是放到sustemui或者fw去实现,但是随着版本的升高,后面出现了TaskView来替代了老版本的分屏方式,但是Task的核心原理其实和之前的方式是一样的,TaskView来实现分屏。

qq_18420641的博客 2615

TaskView简述

TaskView简单介绍

LeeZhenJee的博客 5812

android11.0 Launcher3 高端定制之最近任务栈扩展功能(显示内存信息和全部清理按钮)

效果图 实际效果图 修改前 修改后 修改清单 packages/apps/Launcher3/quickstep/recents_ui_overrides/src/com/android/quickstep/views/MeminfoHelper.java packages/apps/Launcher3/quickstep/recents_ui_overrides/src/com/android/quickstep/views/OverviewActionsView.java packag

cczhengv 2945

Android Automotive OS 中 TaskView 深度解析 (转载)

Android Automotive OS 中的 TaskView 机制深入定制了 Android 的窗口管理,使得车载系统能够在一个屏幕上安全、高效地呈现多个应用界面。这一实现涉及 WindowManager、ShellTaskOrganizer、SurfaceControl 等框架组件协同工作:通过 LaunchCookie 精确匹配任务,通过 SurfaceControl 重组屏幕合成,通过 Insets 调整输入区域,以及通过权限机制保障只有系统应用才能驱动。TaskView 满足了车载场景对于。

m0_59896099的博客 2526

稀疏数据分析:马蹄估计量及其理论性质

稀疏数据分析:马蹄估计量及其理论性质基本框架half-Cauchy分布为什么它叫马蹄估计量后验均值、shrinkage与κ\kappaκθ\thetaθ的边缘先验分布的阶马蹄估计的一致性收敛速率Clarke-Barron(1990)引理马蹄估计的最优收敛速率 这是对The horseshoe estimator for sparse signal这篇论文的回顾,这篇论文在Modern Bayesian statistics与Bayesian Machine Learning领域比较重要,它提出了一种新的先验

一个不愿透露姓名的博客 3799

用Python实现一个猜密码的程序

我们用Python实现猜密码

sk6584631_sz的博客 1261

Android10.0 RecentsView-最近任务流程

最近任务 packages/apps/Launcher3/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java 遍历所有请求,并为新可见的任务加载关联的任务数据,并为不再可见的任务卸载关联的任务数据。 public void loadVisibleTaskData() 获取taskView数量 public int getTaskViewCount() 卸载当前可见任务中的所有关联数据 priva.

吉吉的博客 3706

深入了解 CPU 的型号、代际架构与微架构!

深入了解 CPU 的型号、代际架构与微架构!

欢迎朋友,我是一名十多年开发经验的新手,希望多多指教。 3196

Android7.0多窗口实现原理(一)

概述 在Android N(7.0)版本开始,系统支持了多窗口功能。在有了多窗口支持之后,用户可以同时打开和看到多个应用的界面。并且系统还支持在多个应用之间进行拖拽。在大屏幕设备上,这一功能非常实用。 在Android N中多窗口有三种表现形式: 分屏模式 该模式主要将屏幕一分为二,同时出现两个应用界面。     2.画中画模式 该模式主要在视频播放中使用,可以使视频播放窗口一直处于...

宇落 生命不息,奋斗不止...... 1万+

别再只盯着轨迹线了!FLUENT DPM后处理实战:从粒子采样到直方图报告的完整流程

本文详细介绍了FLUENT DPM后处理的完整流程,从粒子采样到直方图报告的实战技巧。通过设置采样面、分析.dpm文件数据以及创建加权直方图,帮助工程师获取粒子速度、粒径分布等定量信息,提升多相流模拟的深度分析能力。特别适合需要超越轨迹线分析的CFD工程师。

weixin_28730353的博客 278

XPATH注入漏洞检测工具汇总

环境 > Python3.7。

墨痕诉清风的博客 742

Android Task的随笔

近期任务 Task

weixin_44987266的博客 864

Roboflow 与 YOLOv11 数据集全流程:从获取到训练,让你数据无忧

上传图像:点击“Upload”按钮,批量上传本地图像(支持 JPG、PNG 格式,单张最大 10MB)。智能标注:利用 Roboflow 的“Auto-Annotate”功能,基于预训练模型自动生成标注,再手动微调,标注效率提升 70%。格式导出:标注完成后,同样选择“YOLOv11”格式导出,流程与公开数据集一致。

m0_71589036的博客 272

android framework车载桌面CarLauncher的TaskView详细源码分析

可以明显看出这里systemserver跨进程回调到了ShellTaskOrganizer的onTaskAppeared,在这个方法进行精准匹配到TaskView关心的Task变化,然后进行通知。上面第一步已经实现了CarLauncher可以监听Task的相关行为,注意这里肯定是所有的Task行为,但是TaskView它自身只关心Map相关的Task,那么这里是怎么精准通知的呢?通过这个cookie即可以精准的把系统回调的TaskInfo匹配到对应的TaskView。启动Activity相关堆栈。

liaosongmao1的专栏 1769

解决Google Play签名问题:Android App Bundle上传指南

摘要:本文分享了解决Android App Bundle上传至Google Play时遇到的签名问题的经验。当使用pepk.jar工具加密私钥时,出现"NoSuchAlgorithmException"错误。解决方案包括:确保使用JDK 11+版本、更新pepk.jar工具、验证密钥库信息,并提供详细命令行示例。通过升级开发环境和正确配置签名参数,最终成功生成加密密钥文件。文章为开发者提供了实用的技术参考,强调耐心排查问题的重要性。(149字)

m0_62153576的博客 144

YOLO11涨点优化:训练技巧 | 使用标签平滑(Label Smoothing)配合余弦退火学习率,防止过拟合,稳步提点

摘要: YOLO11凭借动态卷积核调度、自适应特征融合等创新成为2026年目标检测主流,但面临训练集过拟合问题。文章聚焦两种零推理开销的正则化技巧:标签平滑(Label Smoothing)和余弦退火学习率(Cosine Annealing LR)。标签平滑通过软化硬标签(如将[1,0]改为[0.9,0.1])防止模型过度自信,代码中通过label_smoothing=0.1一键启用;余弦退火则以平滑的余弦曲线调整学习率(cos_lr=True),避免阶梯衰减的震荡。两者组合可显著缩小YOLO11训练与验证

2601_95807009的博客 45

【Android】性能优化

1,布局优化 (1)减少布局层级 (2)减少同布局层级中控件数量 (3)尽量使用ConstraintLayout布局,这是一种优化的RelativeLayout (4)使用merge标签减少布局层数 (5)warp_content会增加布局measure计算时间 (6)减少onDraw在同一区域过度绘制 <merge>标签 如果通过setContentView设置布局,那么布局会加载到DecorView中去,作为content,而DecorView布局的根布局是FrameLayo

qq_40900926的博客 469

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android SystemUI之Recent,近期列表(五)

一、近期任务列表启动 1.近期列表View结构图 2.NavigationBarFragment.onRecentsClick和NavigationBarFragment.onRecentsTouch 结合上个博客导航栏,我们可以知道近期列表的启动入口是onRecentsTouch和onRecentsClick onRecentsTouch private boolean onRecentsTouch(View v, MotionEvent event) {...

肖岩 6032

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

android T分屏 Launcher RecentsView部分介绍/android framework手机车机系统开发

其他TaskView动画就不进行相关的介绍了,都在这调用堆栈里面,到此时分屏在桌面多任务完成了第一步,把TaskView放到顶部(上屏),接下来要等待用户来手动选择一个下屏app,才可以构成真正意义的分屏。这里createTaskDismissAnimation其实就是上面那个短信应用上半屏幕部分显示的动画构建。点击后会动画进入如下图一样状态,这个短信app放到上面,下面多任务依旧是多任务,位置确实变化了。

learnframework的博客 1614

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

高通Android 12/13 Launcher3修改RecentView与屏幕方向保持一致

最近同事遇到一个需求说,recentview应用预览与屏幕方向不一致,问题,于是加了一些日志,实现此需求。3、最后展示RecentView与屏幕方向保持一致。2、源码修改diff如下所示。源码修改路径汇总如下。

郑敏 1244

android launcher进入编辑模式创建文件夹

创建文件夹和编辑模式功能

a13066876286的博客 563

Android Framework 记录之一

简介 之前的研究太偏向应用层功能实现了,很多原理不了解没有深究,现在研究framework框架层了。 记录 1、下载源码,目录如下: 2、Android系统的层次如下: 3、项目目录简单分析如下: 4、telphony目录 文件 描述 CellIdentityCdma //描述电信通信标识 CellIdentityGsm...

xiaoheliushuiya 1331

Android11 最近任务Recents功能分析,分析的很彻底

Android11 最近任务Recents功能分析,分析的很彻底,值得浏览点赞。

wzx311的博客 1万+
上一篇: android 10车载CarLauncher的ActivityView源码方案分析
下一篇: android多屏触摸相关的详解方案-安卓framework开发手机车载车机系统开发课程
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值