这两天在书上看了一些Notification通知相关的资料,自己尝试了一下遇到了一些问题。经过在网上查找和自己尝试最后总算基本上实现了自己的想法。现在整理一下以防以后忘记。
在使用Notification时主要有两种想法,一、在应用中每发送一次出现一个通知,并且每点一个通知显示自己通知相应的内容。二、在应用中发送多次通知只显示一个通知,但在通知上显示出收到通知的条数。
对于是否出现多个通知可以通过NotificationManager.notify第一个参数ID去控制,如果,发送多次ID相同只显示一个,不同则显示多个。 那对于第一种情况只要每次发送的ID不同就可以了。对于第二种其实就是发送同一个ID,在显示一个条数就可以了。Notification.Number直接设置就会在图标上显示相应的数字。
到现在为止基本上可以实现了前面的两种想法,但具体细节上还是有问题。我的想法通知一般都是定时触发,或是由某种事件引发(比如短信,我还不会),还有下载进度条(也不会,上网查找时有人提到了)。我测试的时候是BroadcastReceiver进行定时触发的,我看的例子是有两个Activity,我也就跟着用两个Activity了。一个用来进行设置,另一个用来显示通知的信息。大概流程是【主Activity设置时间---->BroadcastReceiver到达时间---->主Activity创建、发送通知---->点击通知---->显示Activity显示通知内容,删除通知】。在设置完时间后就可以关闭【主Activity】,在第三部时发送完之后将直接关闭。但我测试的时候,如果间隔时间设置的特别短,屏幕将出现晃动。查找后得知BroadcastReceiver生命周期非常短,不要做耗时操作,但发送通知应该没有问题。最后,流程修改为【主Activity设置时间---->BroadcastReceiver到达时间,创建、发送通知---->点击通知---->显示Activity显示通知内容,删除通知】。在BroadcastReceiver中通过Context参数获取NotificationManager(当时我花了好多时间才获取到它
)。
在费话完大概流程后,说一下我遇到的问题。一、在点击通知后,Notification.Number没清零。二、多通知时的通知内容通过Intent的参数进行传递,但显示的参数内容变成相同的,导致无法删除通知。
那先说一下第一个问题,我在使用【主Activity创建、发送通知】时通过建立静态字段,使两个Activity访问同一个变量。创建时加1,在【显示Activity】中进行清0,这个时候是好使的,但使用【BroadcastReceiver到达时间,创建、发送通知】时,同Activity访问的静态字段始终不是同一个值。最后,没有办法通过【显示Activity】向BroadcastReceiver发送Intent的参数进行清0。
第二个问题主要是由于我想在收到通知后,点击每一条通知时,显示每一条通知的详细信息,并把通知删除。但在收到多条通知后,点击的每一条通知的信息都相同。并且只有最后一条通知可以删除,其它的都删除不掉。后来我上网查找到一种简单删除通知的方法,设置Notification.flags属性为Notification.FLAG_AUTO_CANCEL就可以在点击通知后自动删除。这个要比多数介绍的NotificationManager.cancel方法方便很多。到现在为止,Intent传的参数问题还是没有解决,最后在次上网查找终于发现原因出在PendingIntent上。PendingIntent.getActivity共有四个参数,问题主要出在第二个参数和第四个参数。个人理解第二个参数requestCode如果每次不是相同值,那第四个参数没有什么意义,将创建多个Intent保存传递的参数信息。如果相同,将保留一个Intent,根据第四个参数确认怎么样保留参数信息。
最后总结一下,
1、NotificationManager.notify第一个参数ID控制,是否生成多个通知(Intent中的内容不管)。
2、PendingIntent.getActivity第二个参数控制,Intent是否会保留多个参数信息。
3、Notification.Number可以设置收到的通知条数。
4、设置Notification.flags属性为Notification.FLAG_AUTO_CANCEL可以自动删除。
第一次写博文,希望能记录下自己学习Android的经历。