App可以由很多种方式激活,比如从开始屏幕点击磁贴,叫做启动激活,所有的App都支持。
还可以从副磁贴或toast激活,也叫启动激活。所有的激活方式可以从Windows.ApplicationModel.Activation.ActivationKind 枚举。如下:
- Launch,从主磁贴,副磁贴,或toast。
- Search,从搜索charm进入。
- File,另一个App打开的文件格式是此App支持的。
- Protocol,另一个App打开的URI是此App支持的。
- Device,用户附加的设备是此App支持的(AutoPlay)。
- Contact,用户想让此App发送,拨打,或映射一个联系人。
- LockScreenCall,当锁屏时用户点击toast接电话。
- AppointmentsProvider,另一个App想让此App添加,删除,替换一个约会。
- ShareTarget,用户想从另一个App分享内容到此App。
- FileOpenPicker,用户想从另一个App打开此App有权限访问的文件。
- FileSavePicker,用户想从另一个App保存此App有权限访问的文件。
- CachedFileUpdater,另一个App使用此App缓存的文件。
- ContactPicker,另一个App想访问此App维护的联系人。
- PrintTaskSettings,此App关联了打印机并暴露给了系统设置。
- CameraSettings,此App关联了摄像头并暴露给了系统设置。
激活后会加载Splash画面,画面的图片和背景色是从manifeset文件中读取的,同时创建一个进程加载app。
然后调用App.g.i.cs中的main函数。main函数创建一个主视图线程,此线程创建一个Windows.ApplicationModel.Core.CoreApplicationView的对象作为app的绘制表面。
此绘制表面只能被主视图线程操作。Application基类构造一个App对象的静态函数,以防止被垃圾回收。可以通过Application类的静态属性Current获取App的引用。
注意:引用了静态对象的对象将不会被垃圾回收,内存泄漏也大都是因此而引起。
然后主线程检查激活类型,激活类型有两种:主视图激活或宿主视图激活。
主视图激活会让app的主窗口走到前台,让它可以与用户交互。
宿主视图激活指的是两个App交互时,另一个App请求Windows开一个小窗口让目标App可以交互(提供数据)。
下面是App类的一些虚函数:
protected virtual void OnWindowCreated(WindowCreatedEventArgs args);
// Override any of these main view activations:
protected virtual void OnLaunched(LaunchActivatedEventArgs args);
protected virtual void OnSearchActivated(SearchActivatedEventArgs args);
protected virtual void OnFileActivated(FileActivatedEventArgs args);
// Override any of these hosted view activations:
protected virtual void OnShareTargetActivated(ShareTargetActivatedEventArgs args);
protected virtual void OnFileOpenPickerActivated(FileOpenPickerActivatedEventArgs args);
protected virtual void OnFileSavePickerActivated(FileSavePickerActivatedEventArgs args);
protected virtual void OnCachedFileUpdaterActivated(
CachedFileUpdaterActivatedEventArgs args);
protected virtual void OnWindowCreated(WindowCreatedEventArgs args);
// Override any of these main view activations:
protected virtual void OnLaunched(LaunchActivatedEventArgs args);
protected virtual void OnSearchActivated(SearchActivatedEventArgs args);
protected virtual void OnFileActivated(FileActivatedEventArgs args);
// Override any of these hosted view activations:
protected virtual void OnShareTargetActivated(ShareTargetActivatedEventArgs args);
protected virtual void OnFileOpenPickerActivated(FileOpenPickerActivatedEventArgs args);
protected virtual void OnFileSavePickerActivated(FileSavePickerActivatedEventArgs args);
protected virtual void OnCachedFileUpdaterActivated(
CachedFileUpdaterActivatedEventArgs args);
如果是通过宿主视图激活,则会创建一个宿主视图线程,此线程创建其自有的CoreApplicationView对象用于绘制。当宿主不需要它时,会被销毁。
可以同时有多个宿主,但不能同时有多个主视图窗口。
可以同时有多个宿主,但不能同时有多个主视图窗口。
当app正在运行时,又从toast激活进来,不会创建多个主视图窗口,但是会从激活的回调显示相应的窗口。
注意:要避免在激活回调函数中注册事件,因为可能会被多次激活,所以事件会被注册多次,而应该在OnWindowCreated中注册事件。
注意:先宿主激活再主视图激活的情况,会先执行OnWindowCreated再执行激活方式的相应函数。
注意:如果Windows挂起了app然后又用宿主激活,Windows不会恢复所有线程,主视图的线程仍然会被挂起,这样会导致跨线程通信的线程阻塞。