金融网站建设公司排名,推广seo是什么意思,wordpress排队加载,怎么区别做pc端和手机端网站Notification 发送消息接收消息 #前言
最近在做消息通知类Notification的相关业务#xff0c;利用闲暇时间总结一下。主要分为两部分来记录#xff1a;发送消息和接收消息。
发送消息
发送消息利用NotificationManager类的notify方法来实现#xff0c;现用最普通的方式发… Notification 发送消息接收消息 #前言
最近在做消息通知类Notification的相关业务利用闲暇时间总结一下。主要分为两部分来记录发送消息和接收消息。
发送消息
发送消息利用NotificationManager类的notify方法来实现现用最普通的方式发送
Notification.Builder builder new Notification.Builder(context, channelId);
builder.setSmallIcon(R.drawable.ic_launcher).setContentTitle(标题).setContentText(内容)
Notification notification builder.build();
NotificationManager manager (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel notificationChannel new NotificationChannel(channelId, name,NotificationManager.IMPORTANCE_DEFAULT);
manager.createNotificationChannel(notificationChannel);
manager.notify(R.string.app_name,notification); 这样一段简单的发送消息的代码就完成了。 在发送消息的时候builder可以携带很多参数具体查看api即可这里我记录一下我用到的一些常用的方法。
builder..addAction(icon,title,pendingIntent);三个参数分别是int类型api已过时charText类型和pendingIntent意图。 这个方法我认为就很不错比如当需要封装一个公共的弹窗但是按钮数量和按钮颜色以及弹窗的标题不一样这时候就可以利用这个方法进行规定。因为action是个数组需要几个传几个就可以比如弹窗有两个按钮那么就传两个action过去第一个参数传按钮的颜色值第二个参数传按钮的名称第三个参数传pendingIntent意图。这样就不用很复杂的实现逻辑就可以完成这个公共的弹窗。 同样builder支持传bundle方法如下
Bundle bundle new Bundle();
builder.setExtras(bundle);bundle可以携带参数同理刚才说的封装公共弹窗也可以用bundle传值的形式实现但是相比较action的方式是不是就会复杂很多。 bundle可以传递一些公共的参数比如一个type当接收到通知的时候利用type来区分要做什么动作这个就看项目实际需求了。 这里我把通知跳转意图的跳转activity和接收广播的代码放上来也为自己做个记录。
Bundle bundle new Bundle();
NotificationChannel notificationChannel new NotificationChannel(99, TEMP, NotificationManager.IMPORTANCE_DEFAULT);
Notification.Builder builder new Notification.Builder(MainActivity.this, 99);
//Intent intent new Intent(MainActivity.this,SecondActivity.class);
Intent intent new Intent(MainActivity.this,MyBroadCastReceiver.class);
intent.setAction(android.intent.action.MY_BROADCAST);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//PendingIntent pendingIntent PendingIntent.getActivity(MainActivity.this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent pendingIntent PendingIntent.getBroadcast(MainActivity.this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
builder.setSmallIcon(R.drawable.ic_launcher_background).setContentTitle(标题).setContentText(内容).setWhen(System.currentTimeMillis()).addAction(R.color.purple_200,确定,pendingIntent).addAction(R.color.black,取消,pendingIntent).setExtras(bundle);
Notification notification builder.build();
NotificationManager manager (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.createNotificationChannel(notificationChannel);
manager.notify(R.string.app_name,notification);删除通知
manager.cancel(tag,id);这里注意的是发送通知可以是两个参数和三个参数三个参数的方法第一个参数是tag那么调用删除方法的时候要和这个tag对应上就是要删除哪条消息就传哪个tag。
接收消息
接收消息我是重新创建一个类继承自NotificationListenerService然后复写需要用到的几个方法由于我的项目是systemui的开发所以和实际需求上可能会略有不同。
Overridepublic void onNotificationPosted(StatusBarNotification sbn)该方法是接收到消息通知时的回调。 我不太清楚为什么我只发送了一次通知但在该方法中却收到了两次消息。那就想办法过滤一下吧。利用sbn返回的key和time来判断。
mPreviousNotificationKey sbn.getKey();
mPreviousNotificationKeyTime sbn.getPostTime();正常创建两个变量来保存该次受到的key和postTime。然后利用sp先来获取一次上次保存的这两个值再把该次获取的这两个值利用sp存上。 String mPreviousNotification spHelper.getString(notificationKey);Long mPreviousNotificationTime spHelper.getLong(notificationTime);spHelper.putValues(new SPHelper.ContentValue(notificationKey, mPreviousNotificationKey));spHelper.putValues(new SPHelper.ContentValue(notificationTime, mPreviousNotificationKeyTime));然后根据两次取值判断
if (mPreviousNotificationKey.equals(mPreviousNotification) mPreviousNotificationKeyTime.equals(mPreviousNotificationTime)) {return;
}两次值一样直接return过滤掉。 Overridepublic void onNotificationRemoved(StatusBarNotification sbn)该方法是接收到删除消息的通知。 至此结束方便过后有类似需求查阅。