插件概述
ATAK的插件是额外的Android应用程序,它们不能独立运行,而是依赖于ATAK应用内部的类。这通过特殊的类加载器在运行时将缺失的类文件从插件应用加入到ATAK进程中实现。
插件架构与结构
- 架构特点:插件架构与在ATAK内部开发代码没有区别,所有ATAK组件使用相同的构建块和能力。
- 插件结构:assets/plugin.xml包含了加载插件所需的信息。插件可以实现生命周期(Lifecycle)和/或工具(Tools)。生命周期与MapComponent紧密相关,而工具用于填充操作栏并描述通过点击图标触发的意图。
- 上下文使用:开发过程中需要注意正确使用两种上下文——ATAK主上下文用于构造如AlertDialog等视觉组件;插件上下文用于查找特定于插件的资源和图形。
插件描述xml
<?xml version="1.0" encoding="utf-8"?>
<plugin>
<extension
type="transapps.maps.plugin.lifecycle.Lifecycle"
impl="com.atakmap.android.helloworld.plugin.HelloWorldLifecycle"
singleton="true" />
<extension
type="transapps.maps.plugin.tool.ToolDescriptor"
impl="com.atakmap.android.helloworld.plugin.HelloWorldTool"
singleton="true" />
</plugin>
从这个例子可以看到插件里包含Lifecycle和ToolDescriptor两个两种类型的extension。
插件注册主要逻辑
1、加载工具插件
private int loadToolDescriptorPlugins(Collection<PluginDescriptor> plugins, PluginLoadingProgressCallback progressCallback, int alreadyLoaded, int totalToLoad)
- 目的:从给定的插件集合中加载所有的工具描述符,并通过回调函数报告加载进度。
- 参数:
- plugins: 一个包含扫描过程中发现的插件的集合。
- progressCallback: 当插件正在被加载时使用的进度回调接口。
- alreadyLoaded: 已经加载的工具数量。
- totalToLoad: 尝试加载的描述符总数。
- 返回值:成功加载的描述符总数,这可能与插件总数不同。
2、加载生命周期插件
private int loadLifecyclePlugins(Collection<PluginDescriptor> plugins, PluginLoadingProgressCallback progressCallback, int totalToLoad)
- 目的:根据提供的插件描述符集合加载插件,并通过回调函数报告加载进度。
- 参数:
- plugins: 包含需要加载的插件描述符的集合。
- progressCallback: 在加载插件时使用的进度回调接口。
- totalToLoad: 尝试加载的插件总数,用于计算加载进度百分比。
- 返回值:实际成功加载的插件数量。