Android消息通知Notification常用方法(发送消息和接收消息)

 更新时间:2024年02月06日 14:50:26   作者:Parcelable  
最近在做消息通知类Notification的相关业务,利用闲暇时间总结一下,主要分为两部分来记录:发送消息和接收消息,对Android消息通知相关知识感兴趣的朋友一起看看吧
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

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的开发,所以和实际需求上可能会略有不同。

@Override
    public 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过滤掉。

 @Override
    public void onNotificationRemoved(StatusBarNotification sbn)

该方法是接收到删除消息的通知。
至此,结束,方便过后有类似需求查阅。

到此这篇关于Android消息通知Notification的文章就介绍到这了,更多相关Android消息通知内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • Android实现图文垂直跑马灯效果

    Android实现图文垂直跑马灯效果

    这篇文章主要为大家详细介绍了Android实现图文垂直跑马灯效果,图文结合的跑马灯效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Android模糊处理简单实现毛玻璃效果

    Android模糊处理简单实现毛玻璃效果

    这篇文章主要介绍了Android模糊处理简单实现毛玻璃效果的相关资料,需要的朋友可以参考下
    2016-02-02
  • Android 屏幕切换监听的实例代码

    Android 屏幕切换监听的实例代码

    我试着在屏幕切换时,使View显示在不同的位置,在网上搜索了一些资料,自己做了一段时间,终于完成了功能,今天小编给大家分享android 屏幕切换监听的实例代码,需要的的朋友参考下吧
    2017-01-01
  • Android 正则表达式验证手机号、姓名(包含少数民族)、身份证号

    Android 正则表达式验证手机号、姓名(包含少数民族)、身份证号

    本篇文章主要介绍了Android 正则表达式验证手机号、姓名(包含少数民族)、身份证号的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • Android?应用程序的启动流程示例详解

    Android?应用程序的启动流程示例详解

    这篇文章主要为大家介绍了Android?应用程序的启动流程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Android 连接匿名WiFi的示例代码

    Android 连接匿名WiFi的示例代码

    这篇文章主要介绍了Android 连接匿名WiFi的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Android多语言适配的示例代码(兼容7.0+)

    Android多语言适配的示例代码(兼容7.0+)

    本篇文章主要介绍了Android多语言适配的示例代码(兼容7.0+),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Android之rk3588?开发环境准备及问题解决方法

    Android之rk3588?开发环境准备及问题解决方法

    这篇文章主要介绍了Android中的rk3588?开发环境准备,本文给大家分享遇到的问题及解决方法,本文给大家讲解的非常详细对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • Android RecyclerView使用方法详解

    Android RecyclerView使用方法详解

    这篇文章主要为大家详细介绍了Android RecyclerView的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Android打包篇:Android Studio将代码打包成jar包教程

    Android打包篇:Android Studio将代码打包成jar包教程

    这篇文章主要介绍了Android打包篇:Android Studio将代码打包成jar包教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03

最新评论

?


http://www.vxiaotou.com