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
,surfaceChanged
和surfaceDestroyed
,一般是和SurfaceView配合使用的。
说到这,可以把TaskView理解为一个SurfaceView。
接着说一下 ShellTaskOrganizer.TaskListener
这个接口,这个就属于是WindowManager/Shell
这一套的相关接口了。在系统的任务更改的时候,就能在这个监听中收到回调。在这里,TaskView是这个接口的实现类,那就说明,ShellTaskOrganizer
对TaskView进行管理,当有消息来时,就会去通知给TaskView。
最后说一下ViewTreeObserver.OnComputeInternalInsetsListener
这个接口,这个接口在源码中搜索了下,发现了一个熟悉的类VoiceInteractionSession
,接触到的项目对于语音助手的使用就是基于这个类的相关交互的,往下翻,发现熟悉的onShow
,onHide
方法等等。。。有点跑题了。布局完成的时候,如果实现了这个接口,就能够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