0 背景

在 Android 4.0 以后,系统支持一种更先进的 Notification.Builder 类来发送通知。但 Xamarin 文档含糊其辞,多方搜索无果,遂决定自己摸索。

之前的代码:

//定义通知管理类
NoitficationManager nMgr;
nMgr = (NotificationManager)GetSystemService(NotificationService); //设置通知的图标以及显示的简介Title
Notification notify = new Notification(Resource.Drawable.Icon, "普通通知"); //初始化点击通知后打开的活动
PendingIntent pintent = PendingIntent.GetActivity(this, 0, new Intent(this, typeof(MainActivity)), PendingIntentFlags.UpdateCurrent); //设置通知的主体
notify.SetLatestEventInfo(this, "普通通知标题", "普通通知内容", pintent); //发送通知
nMgr.Notify(0, notify);

如果在 VS2015 ,Xamarin 4.0 版本时,使用此方法,会报错:

“Notification.SetLatestEventInfo(Context, string, string, PendingIntent)”已过时:“deprecated”

1 Android 通知结构

一个通知的最基本元素:

  1. SmallIcon - 图标
  2. ContentTitle - 通知标题
  3. ContentText - 通知内容

可选元素

  1. Sound - 通知声音
  2. Priority - 通知优先级
  3. Ticker - 通知摘要。在 Android 5.0 以下版本,表现为在状态栏闪过的文字
  4. Number - 通知计数,显示为通知横幅右下角的角标数字
  5. 还有更多,本文不再赘述

2 使用Notification.Builder 构建普通通知

下面,以在 Activity 中构建通知为例。

首先,新建项目,并声明通知管理类。

namespace HelloNotification
{
[Activity(Label = "HelloNotification", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
NotificationManager nMgr; protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
//声明通知管理类
nMgr = (NotificationManager)GetSystemService(NotificationService);
}
}
}

第二步,使用 Notification.Builedr 构建一个通知。

var notify = new Notification.Builder(this)
.SetContentTitle("ContentTitle")
.SetContentText("ContentText")
.SetSmallIcon(Resource.Drawable.Icon);

发送通知时,需要用到当前 Activity 的 Context ,就是这个 this 。

第三步,发送通知!

nMgr.Notify(1, notify.Build());

值得注意的是 Notify() 方法的第一个参数 int id 。这个 id 唯一标识 Android App 里面的每个通知,也就是在同一个 App 中, id 不能重复。否则后发出的通知会覆盖之前的通知。

当然,也可以用此方法达到“覆盖通知”的目的。

3 给通知添加声音

即调用 Notification.Builder 的 SetSound 方法。这里使用默认铃声做演示,因为自定义铃声的方法。。。跟这个差很多 = =

需要添加引用: Android.Media

var notify = new Notification.Builder(this)
//省略了其他参数
.SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification))

这样发送的通知就可以带音效了。是不是很酷炫

4 在 Android 5.0 以上发送浮动通知

这很简单,只要把通知的 Priority 设为 High 即可。

不过需要注意的是,高优先级的通知必须设置通知铃声。

var notify = new Notification.Builder(this)
//省略了其他参数
.SetPriority((int)NotificationPriority.High)
.SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification))

5 自定义通知声音

这才是本文的灵魂所在!

调用此方法,需要把通知铃声文件放置在 Recourse 文件夹中。通常要再新建一个子文件夹(这里使用了 raw ,别问我为什么,我也不知道。也许是写起来方便吧)用来存储所有的声音文件。

目录结构:

  • HelloNotification

    * Recourse

    * raw

    * AnotherRingTone.mp3

    * MyRingTone.mp3

引用外部声音文件时,需要使用文件的 Uri 。具体用法及介绍,请看代码。

//注意添加引用!!
using Uri = Android.Net.Uri; notify = new Notification.Builder(this)
//省略的其他参数
.SetPriority((int)NotificationPriority.High)
//从 Uri 设置声音
.SetSound(Uri.Parse("android.resource://" + PackageName + "/" + Resource.Raw.MyRingTone));

可以看到,Xamarin 似乎把目录转化为了 .Net 对象,使用 . 运算符直接可以调用到,并不需要在什么奇怪的地方进行注册。

下面说一点个人理解:

SetSound 方法需要使用类型为 Android.Net.Uri 的参数,而此 Uri 只能在自己包名的目录下寻找吧 = =

所以要用 Uri.Prase 转换路径为 Uri

声明通知之后,便可以使用 nMgr.Notify(1,notify.Build()); 发送此通知了。这是便可以听见 狂拽酷炫 的自定义铃声。

6 所有代码

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Media; namespace HelloNotification
{
[Activity(Label = "HelloNotification", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
NotificationManager nMgr; protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main); nMgr = (NotificationManager)GetSystemService(NotificationService); var notify = new Notification.Builder(this)
.SetContentTitle("ContentTitle")
.SetContentText("ContentText")
.SetPriority((int)NotificationPriority.High)
.SetSound(Uri.Parse("android.resource://" + PackageName + "/" + Resource.Raw.MyRingTone));
.SetSmallIcon(Resource.Drawable.Icon); nMgr.Notify(1, notify.Build());
}
}
}

在 Xamarin.Android 中使用 Notification.Builder 构建通知的更多相关文章

  1. Android中使用Notification实现进度通知栏(Notification示例三)

    我们在使用APP的过程中,软件会偶尔提示我们进行版本更新,我们点击确认更新后,会在通知栏显示下载更新进度(已知长度的进度条)以及安装情况(不确定进度条),这就是我们今天要实现的功能.实现效果如下: 在 ...

  2. 5、xamarin.android 中如何对AndroidManifest.xml 进行配置和调整

    降低学习成本是每个.NET传教士义务与责任. 建立生态,保护生态,见者有份. 我们在翻看一些java的源码经常会说我们要在AndroidManifest.xml 中添加一些东西.而我们使用xamari ...

  3. SignalR在Xamarin Android中的使用

    原文:SignalR在Xamarin Android中的使用 ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 ...

  4. Xamarin.Android中使用android:onClick="xxx"属性

    原文:Xamarin.Android中使用android:onClick="xxx"属性 在原生Android开发中,为一个View增加点击事件,有三种方式: 1.使用匿名对象 ( ...

  5. [置顶] Xamarin android中使用signalr实现即时通讯

    前面几天也写了一些signalr的例子,不过都是在Web端,今天我就来实践一下如何在xamarin android中使用signalr,刚好工作中也用到了这个,也算是总结一下学到的东西吧,希望能帮助你 ...

  6. Xamarin Android 中Acitvity如何传递数据

    在xamarin android的开发中,activity传递数据非常常见,下面我也来记一下在android中activity之间传递数据的几种方式, Xamarin Android中Activity ...

  7. Android中使用Notification实现宽视图通知栏(Notification示例二)

    Notification是在你的应用常规界面之外展示的消息.当app让系统发送一个消息的时候,消息首先以图表的形式显示在通知栏.要查看消息的详情需要进入通知抽屉(notificationdrawer) ...

  8. Android中使用Notification实现普通通知栏(Notification示例一)

    Notification是在你的应用常规界面之外展示的消息.当app让系统发送一个消息的时候,消息首先以图表的形式显示在通知栏.要查看消息的详情需要进入通知抽屉(notificationdrawer) ...

  9. 关于Android中new Notification

    目前 Android 已经不推荐使用下列方式创建 Notification实例: Notification notification = new Notification(R.drawable.ic_ ...

随机推荐

  1. 关于pt与px

    pt:point,点,是印刷业一个标准的长度单位,1pt=1/72英寸:  在Windows里,默认的显示设置中,把文字定义为96dpi.这说明了:1px=1/96英寸:而1pt=1/72英寸,可以得 ...

  2. Titon Toolkit – 非常强大的用户界面组件

    Titon Toolkit 是一个非常强大的用户界面组件,也是实现响应式,移动和现代网页的工具类的集合.每个组件封装了 HTML.CSS 以及为角色特定页面元素的 JavaScript 功能.Tool ...

  3. js中页面刷新和页面跳转的方法总结

    .js中cookie的基本用法简介 2009-12-15 js中页面刷新和页面跳转的方法总结 文章分类:Web前端 关键字: javascript js中页面刷新和页面跳转的方法总结 1.histor ...

  4. Android的UI设计与后台线程交互

    本文将讨论Android应用程序的线程模型以及如何使用线程来处理耗时较长的操作,而不是在主线程中执行,保证用户界面(UI)的流畅运行.本文还将阐述一些用户界面(UI)中与线程交互的API.UI用户界面 ...

  5. [SDK2.2]Windows Azure Cloud Service (35) 使用VS2013发布Azure Cloud Service

    <Windows Azure Platform 系列文章目录> 好久没有更新BLOG了,今天我们继续Windows Azure相关的内容. 笔者最近把Visual Studio升级到了20 ...

  6. 【数据压缩】Huffman编码

    1. 压缩编码概述 数据压缩在日常生活极为常见,平常所用到jpg.mp3均采用数据压缩(采用Huffman编码)以减少占用空间.编码\(C\)是指从字符空间\(A\)到码字表\(X\)的映射.数据压缩 ...

  7. html/css基础篇——link和@inport详解以及脚本执行顺序探讨

    先说一说两者之间的异同 两者都可以引用外部CSS的方式,现在主流浏览器两者都支持(ps:@import是CSS2.1提出的),但是存在一定的区别: 1.link是XHTML标签,除了加载CSS外,还可 ...

  8. Design Pattern: Not Just Mixin Pattern

    Brief 从Mix-In模式到Mixin模式,中文常用翻译为“混入/织入模式”.单纯从名字上看不到多少端倪,而通过采用Mixin模式的jQuery.extend我们是否可以认为Mixin模式就是深拷 ...

  9. [JS] JS模块化开发之RequireJS

    本节将简述RequireJS常用的功能 RequireJS 实现了 Asynchronous Module API. 目录: 为什么使用RequireJS 加载RequireJS Hello Worl ...

  10. ASP.NET MVC处理JsonResult返回时间DateTime问题

    在开发ASP.NET MVC时,如果你有使用jQuery的Ajax去获取一些json数据时,其中数据返回有包含日期时间的话,也许会觉得有点小问题. 现针对此问题,写一个小例子来演示一下,创建一个控制器 ...