Xamarin.Android中NotificationBuilder构建通知


在 Xamarin.Android 中使用 Notification.Builder 构建通知

xamarin.android


1、背景

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

之前的代码:

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

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

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

2、Android 通知结构

一个通知的最基本元素:

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

可选元素

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

3、使用Notification.Builder 构建普通通知

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

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

  1. namespace HelloNotification
  2. {
  3. [Activity(Label = "HelloNotification", MainLauncher = true, Icon = "@drawable/icon")]
  4. public class MainActivity : Activity
  5. {
  6. NotificationManager nMgr;
  7. protected override void OnCreate(Bundle bundle)
  8. {
  9. base.OnCreate(bundle);
  10. SetContentView(Resource.Layout.Main);
  11. //声明通知管理类
  12. nMgr = (NotificationManager)GetSystemService(NotificationService);
  13. }
  14. }
  15. }

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

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

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

第三步,发送通知!

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

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

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

4、给通知添加声音

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

需要添加引用: Android.Media

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

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

5、在 Android 5.0 以上发送浮动通知

这很简单,只要把通知的 Priority 设为 High 即可。
不过需要注意的是,高优先级的通知必须设置通知铃声。

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

6、自定义通知声音

这才是本文的灵魂所在!

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

目录结构:

  1. HelloNotification
  2. Recourse
  3. raw
  4. AnotherRingTone.mp3
  5. MyRingTone.mp3

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

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

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

下面说一点个人理解:

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

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

7、所有代码

  1. using System;
  2. using Android.App;
  3. using Android.Content;
  4. using Android.Runtime;
  5. using Android.Views;
  6. using Android.Widget;
  7. using Android.OS;
  8. using Android.Media;
  9. namespace HelloNotification
  10. {
  11. [Activity(Label = "HelloNotification", MainLauncher = true, Icon = "@drawable/icon")]
  12. public class MainActivity : Activity
  13. {
  14. NotificationManager nMgr;
  15. protected override void OnCreate(Bundle bundle)
  16. {
  17. base.OnCreate(bundle);
  18. SetContentView(Resource.Layout.Main);
  19. nMgr = (NotificationManager)GetSystemService(NotificationService);
  20. var notify = new Notification.Builder(this)
  21. .SetContentTitle("ContentTitle")
  22. .SetContentText("ContentText")
  23. .SetPriority((int)NotificationPriority.High)
  24. .SetSound(Uri.Parse("android.resource://" + PackageName + "/" + Resource.Raw.MyRingTone));
  25. .SetSmallIcon(Resource.Drawable.Icon);
  26. nMgr.Notify(1, notify.Build());
  27. }
  28. }
  29. }

作者:Rocket1184
原文地址:https://www.zybuluo.com/Rocket1184/note/326659

分享到 ype="submip> favs="pw" tn social" tn sr">< tn J_addFavs="pw pdiv llon&class="qq" href="http://con.Ancsscript';x. ';x.ssr">CLIP_HOncsscript';x.ssr"> flyCLIP_HOicatip>

sp决宻统支持一种NotificationBew%20Daid 中 class="item">265id 中 cOicatisscriptider">-id="beml">xamarin.androi'd


'on.Afollow"一item">265icon cOicatisscript4" id="1背景">1、背icatisscriptba&amted"编Afollow"一item">265brief3">>

scode>> hPic=0&sign=支持一种NotificationBle=Xamarin.Aasstp:/Cip> 265le=Xamarin.Aasstp:/srcplyC 统支持一item">265bottom notive;"-box
&sign=ve;"_通_asstp:/ " style="posetTimeq" href="ht;">s="sinspar-id=与讨论>>

scode>> scode>>265le=Xamarin.Aasstp:/__asstp:/s-id="bemldisplay: tp://;"w"一item">265asstp:/s_total_coun="javamessin.me"="javatotal>

119/?via=w 11item">265asstp:/-pin.n_meta来发scode>> hPic=0&a /p> scode>>
s通"一item>11id 中 cO建通知">在 Xamarin.Android 中使用 Notification.Builder 构建通知

xamarin.android


265icon cOicatisscript4" id=O建通知">在 Xamarin.Android 中使用 Notif"1背景">1a>、背icatisscriptba&amted"编Afollow" item">265brief3"> > >b nclasshorf cl >bb total cOicat>76Afollow> a> 总typ">code> >bb知标条> 评论总typ">code> earchPic=0&rchPic=0b 在 Xamarin.Andro1543/-id="beml">xamarin.android



.php?item">265icon cOsign=on&am 通知">在 Xamarin.Andro1543/-ial mobD".comin.知" re url"pun">lasstcln> sp决宻统支 &决宻 &signpic"通知">在 Xamarin.Andro1542/-id="beml">xamarin.android



.php?item">265icon cOsign=on&am 通知">在 Xamarin.Andro1542/-ial mobD".comin.知" re urls摇exte功能.php?u"> sp决宻统支 &决宻 &signpic"通知">在 Xamarin.Andro1539/-id="beml">xamarin.android



.php?item">265icon cOsign=on&am 通知">在 Xamarin.Andro1539/-ial mobD".comin.知" reFurls 码 sp决宻统支 span>p决d=O建通知">在 Xamarin.Android 中使用 Notiial mobD".comin.n">{ s"> lub/1 支 span>

在 Xamarin.Andro1543/-id="beml">xamarin.android



.php?item">265icon cOsign=on&am 通知">在 Xamarin.Andro1543/-ias="ps"知" re url"pun">lasstcln>lasstcln> sp决宻 &决宻 &signpic建通知

在 Xamarin.Andro1542/-id="beml">xamarin.android



.php?item">265icon cOsign=on&am 通知">在 Xamarin.Andro1542/-ias="ps"知" re urls摇exte功能n.知" re urls摇exte功能.php?u"> sp决宻 &决宻 &signpic建通知

在 Xamarin.Andro1539/-id="beml">xamarin.android



.php?item">265icon cOsign=on&am 通知">在 Xamarin.Andro1539/-ias="ps"知" reFurls 码 sp决宻 &决宻 &signpic建通知

在 Xamarin.Andro1537/-id="beml">xamarin.android



.php?item">265icon cOsign=on&am 通知">在 Xamarin.Andro1537/-ias="ps"知" reFurls+Prism—— 知"n classNavig sp决宻 &决宻 &signpic建通知

在 Xamarin.Andro1535/-id="beml">xamarin.android



.php?item">265icon cOsign=on&am 通知">在 Xamarin.Andro1535/-ias="ps"知" reFurls+Prismlass准备n.知" reFurls+Prismlass准备.php?u"> sp决宻 &决宻 &signpic建通知

在 Xamarin.Andro1534/-id="beml">xamarin.android



.php?item">265icon cOsign=on&am 通知">在 Xamarin.Andro1534/-ias="ps"知" r+Prismlass之.nmp standard化n.知" r+Prismlass之.nmp standard化.php?u"> sp决宻 &决宻 &signpic建通知

在 Xamarin.Andro1533/-id="beml">xamarin.android



.php?item">265icon cOsign=on&am 通知">在 Xamarin.Andro1533/-ias="ps"Lisspan>n>Lisspan>n> sp决宻 &决宻 &signpic建通知

在 Xamarin.Andro1530/-id="beml">xamarin.android



.php?item">265icon cOsign=on&am 通知">在 Xamarin.Andro1530/-ias="ps"WeChat(s="linSDK)Binding工程">WeChat(s="linSDK)Binding工程.php?u"> sp决宻 u"> s"> span>


幕右上'mgn=on&'xt&am-7 xt&am-rini-1'ias="ps'45="pl题'id="bem'f cl-siz.an22pt;'钮 < 建通'd


幕右上ttp://sha'mgn=on&'xt&am-8 xt&am-rini-2'ias="ps'18="pl题'id="bem'f cl-siz.an8pt;'钮=text&se 建通'd


幕右上t urlsa'mgn=on&'xt&am-9 xt&am-rini-3'ias="ps'27="pl题'id="bem'f cl-siz.an14.263157894737pt;'钮= urlsp;se 建通'd


幕右上tiosa'mgn=on&'xt&am-10 xt&am-rini-4'ias="ps'27="pl题'id="bem'f cl-siz.an14.263157894737pt;'钮=ios.php?u"> lub//p> scode>> lub/1265asstot uoT='hts="item">265le
ypia NotificationBui&t uoT wi&_tr">"l <关于4">bwi&"mitemgn=on&at&amv>y 119/?via ”,打开网页后点击aboutuchor于lass="md">1a> | ”,打开网页后点击v clact/">联系4"> | ”,打开网页后点击tougao/">投稿p;sear”,#osition: app_downd-se_ uoT='htp;se mp;siplay.cct"al mobD".comin.享玩Sp;siPlayp;se "> imcn.met"al mobD".comin.las源资讯网p;se 119/?via=w"> s"> > hPic=0&a NotificationBui&t uoT wi&_tr">"l <页后资讯网站OS&am >bwi&"mclass="log uoT='-ppn='ht <"submi'text/jaref=dp;searchPic=0&amlack">Seff=damp;t"ic/bookma.js?'+(p;al mobD".comin.Anmg到这篇文>


.php?u"su 119/?via "submi'text/jaref=dp;searchPic= githcbamp;t "ic/bookma.js?'+(p;al mobD".comin.Anmg到这篇文>


.php?u"su "submi'text/jaref=dp;searchPic= msdn.microsoftamp;tzh-cn/rinazine/mt147239.aspx" c/bookma.js?'+(p;al mobD".comin.Anmg到这篇文>


.php?u"su 119/?via "submi'text/jaref=dp;searchPic= ">


.php?u"su/?via 119/?via 119/?v=w s"> > hPic=0&a9/?v=NotificationBqr构建通 AnmgcationBqr"到这篇文>


扫码关lass=刚公众平台scode>><0&rchPic=0b265v clain='ht 11item">265aspyrighri>


| 沪ICP备16000703号-6>>

target="_blank">"> 119/?via lic/bookm';x.sto=link.baid/jaref=dp;search#"HOST+'/puuuuuuuuuuuuuuuuulic/bookm';x.sto=in.Ak.baid/jaref=dp;search#"HOST+'/puuuuuuuuuuuuuuuuulic/bookm';x.ssear.baid/jaref=dp;search#"HOST+/puuuuuuuuuu>>

scode>> > uoT='w" target="_blfixed-tools J_fixedTools <>ype=lic/bookm';x.ssr.getTimeq" href="http://con.Aicatisscript


ref="h到这篇文res.wxamp;to=tign=on&tzh_CN/arinedi/js/wxLe="p.jsh1 daef="hw" targp> 265pp le="pPp"class=" urlgp>


ic/bookm';x." ur: rela4" id=Oncsscriptfa fa-relaCLIP_HOSln"> 119/?via=inputic/bookm'nputiv clrolCip> " placeho('SC="请输s="pl名" n" i a-requiredeq cla"一/pmp;s ?via=p 119/?via=ln"> ic/bookm';x." ur: pboowordd=Oncsscriptfa fa-p://CLIP_HOSln"> 119/?via=inputic/bookm'nputiv clrolCip> a-requiredeq cla"一/pmp;s ?via=pic/bookmsafa"一?via=ln"> ic/bookmremelassmetr">" ur: remelassmed=Onnputin" i spa住4">code="sinsln"> 119/?via=&sign=vst 通知">在 Xamarin.Andro s nal mabutton" valueoge="sinp n" i _通er">s valueogonBuil>ype=/ urlclass="itemp> lass="item">265leg"-tips3">>>


ic/bookm';x." ur: rela_4" id=Oncsscriptfa fa-relaCLIP_HOSln"> 119/?via=inputic/bookm'nputiv clrolCip> " n" i a-requiredeq cla"一/pmp;s ?via=p 119/?via=ln"> ic/bookm';x." ur: rela_emaild=Oncsscriptfa fa-envelopeCLIP_HOSln"> 119/?via=inputic/bookm'nputiv clrolCip> t箱" requiredeqp;p> a-requiredeq cla"一/pmp;s ?via=p 119/?via=ln"> ic/bookm';x." ur: rela_pbood=Oncsscriptfa fa-p://CLIP_HOSln"> 119/?via=inputic/bookm'nputiv clrolCip> a-requiredeq cla"一/pmp;s ?via=p 119/?via=ln"> ic/bookm';x." ur: rela_pboo2d=Oncsscriptfa fa-retweetCLIP_HOSln"> 119/?via=inputic/bookm'nputiv clrolCip> " span aptchad n" i < aptchad placeho('SC="输s验证获取验证 s nal mabutton" valueoglass="p n" i _通er">s valueogonBuil>yp /p> s urlclass="item">265leg"-tips3">>> ref="h $(".po=in.le="po)hr ickdocument.getl $.rin.(l _MBT.u="+'/inr /des/> : <#o,l scope:


oid /po=in./"),l state:="jav,l st"be: -align:cn"aer;cu=sor:poi"aer;f cl-siz.a14px;color:#2faf16d c/bookmreturnyle="po>返回class="sins"> ');l $(".returnyle="po)hr ickdocument.getl $('#po=in._le="p').te()();l $("#le="po)h <();l })l }l }l );l })l daef="hw" targsscriptftiv clain=' J_FuoT='Bann='ht"item">265v clain='ht=misscript"l data-an="> s"> ref="h到这篇文>



=4.7.7'1 daef="hw" targd="bemldisplay:nosp> ref="h var _hmt = _hmt || []; document.ge { var hm = >
share.baidu.tionBui""ref="h")[0]; s.ppaidN给inelatB通(hm, s); })(); l daef="hw ref="h document.get var bp = > 在 Xamarin.Androjou?'+(/v157c3你">Orgy.php?ucn"aer= =httodye>