商店应用的进程模型 -- 激活

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);

主视图或宿主视图激活后,线程创建的窗口调用OnWindowCreated虚函数,完成后调用OnActivated函数。
如果是通过宿主视图激活,则会创建一个宿主视图线程,此线程创建其自有的CoreApplicationView对象用于绘制。当宿主不需要它时,会被销毁。
可以同时有多个宿主,但不能同时有多个主视图窗口。
当app正在运行时,又从toast激活进来,不会创建多个主视图窗口,但是会从激活的回调显示相应的窗口。
注意:要避免在激活回调函数中注册事件,因为可能会被多次激活,所以事件会被注册多次,而应该在OnWindowCreated中注册事件。
注意:先宿主激活再主视图激活的情况,会先执行OnWindowCreated再执行激活方式的相应函数。
注意:如果Windows挂起了app然后又用宿主激活,Windows不会恢复所有线程,主视图的线程仍然会被挂起,这样会导致跨线程通信的线程阻塞。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值