http://blog.csdn.net/nacl025/article/details/8998552
http://blog.csdn.net/nacl025/article/details/9037247
打开一个推送通道(如果它尚不存在),或者连接到一个现有的推送通道。如果您的应用在之前的应用实例中创建了推送通道,则可能会存在一个推送通道。如果推送通道绑定到图块或 Toast 通知,则应用退出之后推送通道仍然存在,这样,即使该应用未运行,也仍然可以接收这些通知。
使用 Raw 通知的应用必须实现 HttpNotificationReceived 事件以接收通知中的 Raw 数据。(如果应用处于非运行态,则无法接收Raw通知)
如果您的应用已在运行,则忽略 Toast 通知,除非您注册 ShellToastNotificationReceived 事件。然后,您的应用可以决定它希望响应 Toast 通知的方式。
原始通知
1、原始通知是可以触发后台任务的唯一的通知类型。尽管 Toast、磁贴和锁屏提醒推送通知不能触发后台任务,但是原始通知触发的后台任务可以通过本地 API 调用来更新磁贴和调用 Toast 通知。
2、对于每个应用,一次只能运行一个后台任务。如果为已在运行后台任务的应用触发后台任务,则必须先完成第一个后台任务,然后才能运行新的后台任务。
3、如果应用正在运行,则通知传递事件优先于后台任务,并且应用将拥有处理通知的第一个机会。通知传递事件处理程序可以通过将事件的 PushNotificationReceivedEventArgs.Cancel 属性设置为 true 来指定处理程序退出后不应该将原始通知传递给它的后台任务。如果 Cancel 属性设置为 false 或者未设置(默认值为 false),则原始通知会在通知传递事件处理程序完成其工作后触发后台任务。
选择原始通知触发的后台任务之前,考虑使用其他通信方法。大多数应用不应该需要实现后台任务。若要使应用使用后台任务,该应用必须是允许固定到锁屏的少数应用之一。你的应用将争用这些插槽,并且用户对占用插槽的应用拥有最终控制权。不保证你的应用就是其中之一。通过在你的应用中使用其他实现通信的机制(如标准推送通知或 Toast 更新),你可以防止用户必须在你的应用和他们关注的其他应用之间作出选择。
后台任务的一些替代方法:(说明一点,Toast\Title通知都可以后台运行,但不能触摸发后台任务)
- 若要吸引用户的注意,请发送 Toast 推送通知。
- 若要更新磁贴,请使用磁贴推送通知。
4、原始通知触发的后台任务:用户必须显式给予应用运行后台任务的权限,当用户将应用添加到其锁屏时会授予此权限。一次只能有七个应用拥有此权限。
- PushNotificationChannel channel = null;
- channel.PushNotificationReceived += OnPushNotification;
- try
- {
- channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
- }
- catch (Exception ex)
- {
- // ...
- }
- string content = null;
- private async void OnPushNotification(PushNotificationChannel sender, PushNotificationReceivedEventArgs e)
- {
- String notificationContent = String.Empty;
- switch (e.NotificationType)
- {
- case PushNotificationType.Badge:
- notificationContent = e.BadgeNotification.Content.GetXml();
- break;
- case PushNotificationType.Tile:
- notificationContent = e.TileNotification.Content.GetXml();
- break;
- case PushNotificationType.Toast:
- notificationContent = e.ToastNotification.Content.GetXml();
- break;
- case PushNotificationType.Raw:
- notificationContent = e.RawNotification.Content;
- break;
- }
- e.Cancel = true;
- }