原生消息推送
2017-04-26 本文已影响42人
gogoingmonkey
现在项目中,很多都是用的是第三方的消息推送,个推、魔推等消息推送都有相关文档,比如个推还有一个简单的Demo,确实几分钟就能集成,但是里面还是有很多的坑!今天主要说说安卓原生的通知。
消息推送可以写在服务,广播,活动中,但是大多数时间都是卸载服务广播中的,因为只有当不在这个活动中了,一般使用通知,直接上代码:
NotificationManager systemService = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification builder = new NotificationCompat.Builder(MainActivity.this).setContentText("SSsss").setAutoCancel(true).setContentTitle("title")
.setSmallIcon(R.mipmap.ic_launcher).setSound(Uri.fromFile(new File("system/media/audio/ringtones/Luna.ogg")))
.setLights(Color.GREEN,1000,1000).setVibrate(new long[]{0,1000,1000,1000,10000}).setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setStyle(new NotificationCompat.BigTextStyle().bigText("sssssssssssssssswwwwwwwwwwssssssssssssss")).setPriority(Notification.PRIORITY_MAX).build();
systemService.notify(1, builder);
对以上代码简单解释下:先获取系统服务的通知服务,然后使用NotificationCompat这个类创建对象,因为系统每个版本对通知这块的API改动都比较大,所以使用整个类能做到兼容。然后再设置显示标题,图像等一系列信息。最后使用notify方法,注意该方法的第一个参数必须不同于其他的通知;
按照上面代码,运行到手机上,却不能点击, 这就引出了pendingintent;
PendingIntent 使用
这个和Intent都可以发送一个意图,但是他们的区别在于Intent 是立即执行这个意图,而PendingInetnt 则是在某个指定的时间点去发送这个意图。
PendingIntent提供了几个静态的方法getActivity, getboradcast,getserver这个几个方法,参数都一样,有四个第一个是一个上下文,第二个参数我从来没用过,几乎是用不到的,传0就可以,第三个参数就是意图,第四个参数,是一个模式,棘突的可以看下文档,一般使用传(context,0,intent,0); 添加到通知的使用就是在链式后面加上 . setContentintent(pi)传入PendingIntent的实例;
Intent intent = new Intent(MainActivity.this, DeaitalActivity.class);
PendingIntent activity = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
NotificationManager systemService = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification builder = new NotificationCompat.Builder(MainActivity.this).setContentText("SSsss").setContentIntent(activity).setAutoCancel(true).setContentTitle("title")
.setSmallIcon(R.mipmap.ic_launcher).setSound(Uri.fromFile(new File("system/media/audio/ringtones/Luna.ogg")))
.setLights(Color.GREEN,1000,1000).setVibrate(new long[]{0,1000,1000,1000,10000}).setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setStyle(new NotificationCompat.BigTextStyle().bigText("sssssssssssssssswwwwwwwwwwssssssssssssss")).setPriority(Notification.PRIORITY_MAX).build();
systemService.notify(1, builder);
这样就解决了通知的点击事件,然后当你点击了你会发现通知栏怎么还有,那是因为通知需要我们处理才会消失,让他消失有两种方式:1.在链式调用后加上.setAutoCancel(true)让自动取消;2.获取到系统服务的通知对象调用这个服务对象的 .cancle(1)方法,这个1就是刚才我们创建这个通知的id号码;
上面的 NotificationCompat.Builder 还提供了其他setSound()发送
.setSmallIcon(R.mipmap.ic_launcher).setSound(Uri.fromFile(new File("system/media/audio/ringtones/Luna.ogg"))).setVibrate(new long[]{0,1000,1000,1000,10000}) 震动,或声音
上面的还提供了API。 可以设置富文本 setStyle( )
.setStyle(new NotificationCompat.BigTextStyle().bigText("sssssssssssssssswwwwwwwwwwssssssssssssss")).setPriority(Notification.PRIORITY_MAX).build();
手机震动还需要加上权限:
<uses-permission android:name="android.permission.VIBRATE"></uses-permission>
最后提醒下,这个通知最好是比较重要的内容,以免引起用户的反感,导致我们的引用别卸载!
附上一个demo: https://github.com/zh2016hz/NotifydataDemo.git