首页 > 其他分享 >TaskView简述

TaskView简述

时间:2023-01-05 01:11:31浏览次数:43  
标签:创建 create 接口 TaskView 简述 onCreate public

TaskView简述

TaskView是什么

首先看一下官方的注释(基于Android12.0.0_r3版本的代码分析):

View that can display a task
是一个可以展示Task的视图。那有什么用呢?简单来说就是跨进程来展示UI。就比如我有两个进程,进程A和进程B。我想在进程A中启动进程B的Activity,这时候就可以使用TaskView来实现这个功能。

接着再来说TaskView是什么?

TaskView 是SurfaceView的子类,并且实现了
SurfaceHolder.Callback, ShellTaskOrganizer.TaskListener, ViewTreeObserver.OnComputeInternalInsetsListener这三个接口

首先说一下SurfaceView,这个用过的人都有些印象,比如摄像头的录制展示可以用SurfaceView来展示或者是一些需要即时更新的UI可以通过SurfaceView来进行展示。换大多数人的说法就是挖了个洞,也确实是,如果要是保证效率,没必要做那么多没用的操作,有个捷径何尝不是个好事情~。
接着是 SurfaceHolder.Callback,注册了这个Callback,就能够接受到Surface改变的回调,经典的三个方法surfaceCreated,surfaceChangedsurfaceDestroyed,一般是和SurfaceView配合使用的。
说到这,可以把TaskView理解为一个SurfaceView。
接着说一下 ShellTaskOrganizer.TaskListener这个接口,这个就属于是WindowManager/Shell这一套的相关接口了。在系统的任务更改的时候,就能在这个监听中收到回调。在这里,TaskView是这个接口的实现类,那就说明,ShellTaskOrganizer对TaskView进行管理,当有消息来时,就会去通知给TaskView。
最后说一下ViewTreeObserver.OnComputeInternalInsetsListener这个接口,这个接口在源码中搜索了下,发现了一个熟悉的类VoiceInteractionSession,接触到的项目对于语音助手的使用就是基于这个类的相关交互的,往下翻,发现熟悉的onShowonHide方法等等。。。有点跑题了。布局完成的时候,如果实现了这个接口,就能够onComputeInternalInsets接受到回调,语音助手收到后回去进行自己的UI绘制。

TaskView的创建

创建还不好说么,直接new一个,开句玩笑。具体如何创建,还得看谷歌源生代码是怎么使用的。

/** Interface to create TaskView. */
@ExternalThread
public interface TaskViewFactory {
    /** Creates an {@link TaskView} */
    void create(@UiContext Context context, Executor executor, Consumer<TaskView> onCreate);
}

搜索TaskView的构造方法,发现TaskViewFactory,听名字就是一个TaskView的创建类,查看注释,更加确定就是通过这个接口来创建TaskView了。终归是一个接口,去看下具体实现。

/** Factory controller which can create {@link TaskView} */
public class TaskViewFactoryController {
    private final ShellTaskOrganizer mTaskOrganizer;
    private final ShellExecutor mShellExecutor;
    private final TaskViewFactory mImpl = new TaskViewFactoryImpl();

    public TaskViewFactoryController(ShellTaskOrganizer taskOrganizer,
            ShellExecutor shellExecutor) {
        mTaskOrganizer = taskOrganizer;
        mShellExecutor = shellExecutor;
    }

    public TaskViewFactory asTaskViewFactory() {
        return mImpl;
    }

    /** Creates an {@link TaskView} */
    public void create(@UiContext Context context, Executor executor, Consumer<TaskView> onCreate) {
        TaskView taskView = new TaskView(context, mTaskOrganizer);
        executor.execute(() -> {
            onCreate.accept(taskView);
        });
    }

    private class TaskViewFactoryImpl implements TaskViewFactory {
        @ExternalThread
        public void create(@UiContext Context context,
                Executor executor, Consumer<TaskView> onCreate) {
            mShellExecutor.execute(() -> {
                TaskViewFactoryController.this.create(context, executor, onCreate);
            });
        }
    }
}

可以看到TaskViewFactoryController的内部类TaskViewFactoryImpl实现了TaskViewFactory这个接口,并且交给TaskViewFactoryController来进行TaskView的创建。到这里大概就知道了,创建TaskView时需要创建一个ShellTaskOrganizer和一个ShellExecutor对象,接着再来创建一个TaskView对象。这里留个猜测,等到TaskView启动的Activity的onCreate()执行后,才去创建TaskView对象。
到此为止,TaskView的创建暂时来个中场休息~


标签:创建,create,接口,TaskView,简述,onCreate,public
From: https://www.cnblogs.com/zhenji-li/p/17026427.html

相关文章

  • I2C简述
    1.协议特点引脚少,硬件实现简单,不需要USART,CAN的外部收发设备广泛用于系统内多个集成电路之间的通信2.物理层@总线总线可以挂在多个主从通讯设备它是一个支持多设......
  • 简述游戏地图制作过程(一)
      概述以三国地图为例子,给大家介绍下策略游戏的地图设计方法,主要包括原型搭建,地形细化,动线设计。 原型搭建首先明确地图基础规则:地图由格子组成,单个格子带地形属......
  • 【线代&NumPy】第九章 - 线性变换课后练习 | 简述并提供代码
    ......
  • 【线代&NumPy】第十章 - 正交性课后练习 | 施密特正交化 | QR分解法 | 简述并提供代码
    ......
  • 块状数组简述
    参考资料:分块思想是一种广泛的思想,树状数组与线段树实际上都是使用了该种思想。但是,在实际问题中,我们常常会遇到一些更为灵活的问题,用线段树或者树状数组并不是那么好用。......
  • Ajax简述 —— 快速增量式响应
    AjaxAjax的简介及用法Ajax是指异步JS和XML,使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。......
  • 积分饱和现象简述, 以及积分限幅的处理和输出限幅的区别
    积分饱和现象简述,以及积分限幅的处理和输出限幅的区别: ......
  • 第一章 C语言简述
    C语言发展简史基本概念程序用程序设计语言安排好的处理步骤称为程序。程序是操作指令的集合程序设计用程序设计语言编制程序的过程叫做程序设计语言的发展二进制语言电脑是......
  • HJB方程简述
    参考资料:维基的哈密顿-雅克比-贝尔曼方程条目。有条件的同学可以自行查看,效果比本文要好一些。文末也会给出相关更深入的资料供大家学习。作为强化学习的一个基础思想,HJB......
  • Java同步器简述
    一、概述在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之间如何通信、协作。主要原因是,对于多线程实现实现并发,一直以......