HoloLens开发手记 - 应用程序模型 App model
HoloLens使用Universal Windows Platform (UWP)提供的应用模型。UWP应用模型定义了应用如何被安全和完全地安装、更新、版本控制和移除。它管理了应用生命周期 - 应用如何被执行、休眠和中断 - 以及如何保留应用状态。它也覆盖了和操作系统、文件以及其他应用的集成和交互。
应用生命周期 App lifecycle
全息应用的生命周期涉及到了标准应用的概念,例如放置。启动、中断和移除。
放置就是启动 Placement is launch
每一个应用都通过放置应用磁贴在HoloLens shell中启动。这些应用磁铁,在放置的时候,就将开始运行应用。这些应用磁贴会持久化的停留在它们被放置的位置,任何时候你都可以从它们返回应用。
一旦完成放置(除非放置是由应用间启动唤起的),应用开始启动。HoloLens应用同一时刻可以运行一个应用。一旦你放置和启动了一个应用,任何其他激活的应用都会被挂起,在你放置它的地方,应用磁贴上会留下一个它最后状态的截图。阅读标准生命周期的文章来了解更多关于处理恢复和其他生命周期事件的方法。
移除是关闭/终止处理 Remove is close/terminate process
当你从世界中移除一个放置好的应用磁贴,这闭合了基础的流程。这对于确保你的应用被终止或者重启一个有问题的应用可能是有用的。
应用暂停/终止 App suspension/termination
使用HoloLens,用户能够为一个应用创建多个启动入口。它们通过从开始菜单启动你的应用,并将应用磁贴放置在世界中来做到这点。每一个应用磁贴都表现为不同的启动入口,在系统中都具有一个单独的磁贴实例。SecondaryTile.FindAllAsync() 查询的队列将可以列出所有应用的二级磁贴。
当一个UWP应用暂停时,应用当前状态的屏幕截图被获取。
与其他Windows 10平台的关键区别是通过CoreApplication.Resuming和CoreApplication.Activated事件,应用如何被通知它的一个实例被激活。
情况 | 恢复 | 激活 |
从开始菜单启动一个应用新实例 | 使用一个新的TileId激活应用 | |
从开始菜单启动第二个应用实例 | 使用一个新的TileId激活应用 | |
选中当前未激活的应用实例 | 使用实例关联的TileId激活应用 | |
选中一个不同的应用,然后选中先前激活的实例 | 恢复被触发 | |
选中一个不同的应用,然后选中先前未激活的实例 | 恢复被触发 | 然后使用实例关联的TileId激活应用 |
扩展的执行 Extended execution
有时你的应用需要继续在后台做一些工作或者播放声音。Background tasks 在Windows Holographic里是可以使用的,但是有一些限制。
应用视图 App views
当你的应用激活时,你可以选择显示哪种类型的视图。对一个应用CoreApplication来说,总存在一个初始的应用视图(app view)和任意数量的其他你想创建的次级视图。对于桌面环境,你可以认为一个应用视图就是一个窗口。我们的全息应用项目模板将会创建一个初始视图是全息视图的Unity项目。你的应用可以使用像Xaml这样的技术来创建额外的2D视图来使用应用内购买之类的shell控件。如果你的应用以通用应用形式启动,那么初始视图会是2D的,但是你可以通过添加一个额外的全息视图来提升在HoloLens的体验。想象一下,我们用XAML构建了一个图片查看器,里面有个视图切换按钮,可以一键切换到全息视图,在全息视图中,来自应用的照片飞到世界和物体表面上。
创建一个全息视图 Create a Holographic view
全息视图是指那些通过HolographicSpace 类型创建了全息视图的应用。
混合世界中的2D视图 2D view in the Mixed World
任何非全息视图的在你的世界中都会被渲染成2D视图.
次级视图磁贴的放置 Placement of further App Tiles
使用二级磁贴(Secondary Tile) API你可以放置任意数量你想要的2D视图。这些被放置的磁贴将会以闪屏的形式出现,用以来之后启动你的应用。Windows Holographic当前不支持渲染任何2D磁贴作为动态磁贴。在二级磁贴API(Secondary tile APIs)页面你可以了解到更多信息。
切换视图 Switching views
从2D视图切换到全息视图 Switching from the 2D XAML view to the holographic view
如果用户使用了XAML,然后XAML IFrameworkViewSource将会控制应用的首个视图。应用需要在激活CoreWindow之前切换到全息视图,以保证应用直接进入全息体验。
使用CoreApplication::CreateNewView 和 ApplicationViewSwitcher::SwitchAsync 来实现视图的切换。
注意:
- 当从XAML视图切换到全息视图或将被从世界中移除的应用面板时,不要为SwitchAsync方法指定Consolidate标记
- SwitchAsync方法应该被你想要切换去的视图关联的Dispatcher所调用
- 如果你需要启动一个虚拟键盘或想要激活其他应用,你需要使用SwitchAsync方法回到XAML视图
从全息视图切换回键盘XAML视图 Switching from the holographic view back to a keyboard XAML view
在视图间反复切换通常是为了在全息应用显示一个键盘。如果你的应用显示了一个2D视图,shell只能够显示系统键盘。如果你的应用需要获取文本输入源,然后他们会写一个带有文本输入框的自定义XAML视图,它能在切换到它后,输入完成后再切换回去。
上述所说情形,可以使用ApplicationViewSwitcher::SwitchAsync 从你的全息视图切换回XAML视图。
应用大小 App size
2D应用视图总是出现在一个固定的可视面板中。这使得所有2D视图显示同等数量的内容。下面是关于2D应用视图大小的进一步细节:
- 调整大小时,应用的宽高比始终一样
- 调整大小时,应用的分辨率和拉伸率都不会改变
- 应用不能查询他们在世界中实际的大小
应用磁贴 App tiles
开始菜单使用了标准小号和中号磁贴用于pin视图和所有应用视图。
应用间交互 App to app interactions
当你构建应用时,Windows 10上你可以获得丰富的应用间通信机制。即使HoloLens目前不支持最新的应用协议启动(app service protocol launches),但是许多新的协议API和文件注册机制在HoloLens上能够确保应用间启动和通信。
协议 Protocols
HoloLens通过Windows.System.Launcher APIs 支持应用间启动。
当启动其他应用时,以下内容要被考虑:
- 当非模态启动时,例如LaunchUriAsync,用户在与应用交互前必须放置好它
- 当模态启动时,例如LaunchUriForResultsAsync,模态应用会被放置在窗口顶部
- HoloLens不能在独占视图(这里应该是指全息视图?)顶部覆盖上其他应用。为了显示启动的应用,HoloLens会使用会回到世界中以显示此应用。
文件选取器 File pickers
HoloLens支持FileOpenPicker 和 FileSavePicker 合约。尽管没有支持文件选取合约的应用被预装,但是你可以从Windows Store下载它们 - 例如OneDrive。
如果你安装了多个文件选取应用,你将不会看到任何有歧义的UI,这些UI通常是用来选取启动哪个应用。取而代之的是,首个安装的文件选取器将会被选中。保存文件时,会自动生成包括时间戳的文件名。用户不能改变文件爱你们。
默认情况下,以下是本地支持的文件拓展格式:
应用合约和Windows Holographic扩展 App contracts and Windows Hologrphic extensions
应用合约和拓展入口允许你注册你的应用来使用更底层的操作系统特性,例如处理文件拓展或者使用后台任务。下面是Windows Holographic支持的合约和拓展入口列表。这与它支持的API集合不同。
应用文件存储 App File Storage
所有的存储都是通过Windows.Storage命名空间实现。阅读下面的内容来了解更多细节。HoloLens不支持应用存储同步/漫游。
- 文件、文件夹和库 Files, folders, and libraries
- 商店和检索设置以及其他应用数据 Store and retrieve settings and other app data
已知目录 Known folders
查看KnownFolders 来了解更多UWP应用使用KnownFolders的细节。
Property 属性 |
Supported on HoloLens Development Edition HoloLens开发板是否支持 |
Description 描述 |
---|---|---|
AppCaptures | Yes |
Gets the App Captures folder. 获取应用捕获文件夹 |
CameraRoll | Yes |
Gets the Camera Roll folder. 相机文件夹 |
DocumentsLibrary | Yes |
Gets the Documents library. The Documents library is not intended for general use. 文档库 |
MusicLibrary | Yes |
Gets the Music library. 音乐库 |
Objects3D | Yes |
Gets the Objects 3D folder. 3D对象文件夹 |
PicturesLibrary | Yes |
Gets the Pictures library. 图片库 |
Playlists | Yes |
Gets the play lists folder. 播放列表文件夹 |
SavedPictures | Yes |
Gets the Saved Pictures folder. 保存的图片文件夹 |
VideosLibrary | Yes |
Gets the Videos library. 视频库 |
HomeGroup | No |
Gets the HomeGroup folder. 家庭组文件夹 |
MediaServerDevices | No |
Gets the folder of media server (Digital Living Network Alliance (DLNA)) devices. 媒体设备文件夹 |
RecordedCalls | No |
Gets the recorded calls folder. 电话录音文件夹 |
RemovableDevices | No |
Gets the removable devices folder. 可移动设备文件夹 |
应用打包 App package
使用Windows10,你不再需要以操作系统为目标但是取而代之的是,你需要以一个或多个设备家族来作为目标(target your app to one or more device families)。一个设备家族定义了此家族中所有设备都可应用的API、系统字符集和行为集合。它也决定了你的应用从应用商店中能安装到哪系列的设备。
翻译自:https://developer.microsoft.com/en-us/windows/holographic/app_model#App_views