Android 自定义通知样式(回复、点赞)

1、实现自定义通知样式,本文基于极光推送,核心处理逻辑,不区分具体推送平台

2、通知类型判断:

根据极光通知类型判断(自定义消息,极光本身是不支持通知展示回复、点赞等功能)
if(JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())){//极光自定义消息,服务端传递给极光自定义消息内容String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);//极光通知消息Id,后面创建消息notifyId(消息唯一性)String msgId = bundle.getString(JPushInterface.EXTRA_MSG_ID);//极光通知类型数据,自定义消息则没有值String extra = bundle.getString(JPushInterface.EXTRA_EXTRA);
}

3、判断应用通知权限

 /*** 判断通知权限是否开启* @return true,开启通知权限  false:未开启通知权限*/public static boolean hasNotifyPermission(Context context) {if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);if (manager != null) {return manager.areNotificationsEnabled();}} else {NotificationManagerCompat manager = NotificationManagerCompat.from(context);if (manager != null) {return manager.areNotificationsEnabled();}}return true;}

4、根据自定义消息message获取相关字段(用户头像、用户发送内容大图、多文字、回复、点赞等)

1、获取头像Bitmap/*** 获取头像图片bitmap** @param context* @param userImageUrl* @param bigImageUrl* @param glideLoadCallBack*/private static void notificationBitmap(Context context, String userImageUrl, String bigImageUrl, GlideLoadCallBack glideLoadCallBack) {if (context != null) {if (userImageUrl != null && userImageUrl.length() > 0) {Glide.with(context).asBitmap().load(userImageUrl).addListener(new RequestListener<Bitmap>() {@Overridepublic boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) {notificationBigBitmap(context, null, bigImageUrl, glideLoadCallBack);return false;}@Overridepublic boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) {notificationBigBitmap(context, resource, bigImageUrl, glideLoadCallBack);return false;}}).submit(60, 60);} else {notificationBigBitmap(context, null, bigImageUrl, glideLoadCallBack);}} else if (glideLoadCallBack != null) {if (glideLoadCallBack != null) {glideLoadCallBack.onLoadBitmap(null, null);}}}2、获取大图Bitmap/*** 获取大图 bitmap** @param context* @param userBitmap* @param bigImageUrl* @param glideLoadCallBack*/private static void notificationBigBitmap(Context context, Bitmap userBitmap, String bigImageUrl, GlideLoadCallBack glideLoadCallBack) {if (context != null) {if (bigImageUrl != null && bigImageUrl.length() > 0) {Glide.with(context).asBitmap().load(bigImageUrl).addListener(new RequestListener<Bitmap>() {@Overridepublic boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) {if (glideLoadCallBack != null) {glideLoadCallBack.onLoadBitmap(userBitmap, null);}return false;}@Overridepublic boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) {if (glideLoadCallBack != null) {glideLoadCallBack.onLoadBitmap(userBitmap, resource);}return false;}}).submit(100, 300);} else if (glideLoadCallBack != null) {if (glideLoadCallBack != null) {glideLoadCallBack.onLoadBitmap(userBitmap, null);}}}}3、图片加载回调public interface GlideLoadCallBack {void onLoadBitmap(Bitmap userBitmap, Bitmap bigBitmap);}

5、创建通知(重点)

 /*** 创建通知** @param context* @param pushBean* @param bigBitmap*/
public static void createNotification(Context context,Bitmap userBitmap, Bitmap bigBitmap, String msgId, String msg) {NotificationCompat.Builder newMessageNotification = new NotificationCompat.Builder(context, CHANNEL_ONE_ID);//输入框actionRemoteInput remoteInput = new RemoteInput.Builder(PushJobIntentService.INPUT_TEXT).setLabel("请输入内容").build();PendingIntent replyIntent = customNotificationByClickButton(context, pushBean, 1);NotificationCompat.Action remoteInputBuilder = new NotificationCompat.Action.Builder(R.mipmap.comment_icon, "回复", replyIntent).addRemoteInput(remoteInput).build();newMessageNotification.addAction(remoteInputBuilder);//点赞PendingIntent likeIntent = customNotificationByClickButton(context, pushBean, 2);NotificationCompat.Action likeBuilder = new NotificationCompat.Action.Builder(R.mipmap.comment_like_icon, "点赞", likeIntent).build();newMessageNotification.addAction(likeBuilder);//大图notificationBigPicture(newMessageNotification, userBitmap, bigBitmap, pushBean.getPushContent());// Issue the notification.showNotification(context, pushBean.getPushNotifyId(), newMessageNotification, bigBitmap, pushBean);}/*** 点击事件,对应 pendingIntent** @param context* @param pushBean* @param clickType 1:回复or评论  2:点赞* @return*/public static PendingIntent customNotificationByClickButton(Context context, PushBean pushBean, int clickType) {if (pushBean != null) {Intent intent = new Intent(context, PushJobIntentService.class);intent.putExtra("自定义消息数据", "自定义消息数据");return PendingIntent.getService(context, randomNextInt(), intent, PendingIntent.FLAG_CANCEL_CURRENT);}return null;}/*** 添加大图片 BigPictureStyle** @param newMessageNotification* @param bigBitmap*/private static void notificationBigPicture(NotificationCompat.Builder newMessageNotification, Bitmap userBitmap, Bitmap bigBitmap, String bigText) {if (newMessageNotification != null) {if (bigBitmap != null) {newMessageNotification.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(bigBitmap).bigLargeIcon(userBitmap));} else if (bigText != null && bigText.length() > 0) {notificationBigText(newMessageNotification, bigText);}}}/*** 添加 多文字  BigTextStyle** @param newMessageNotification* @param bigText*/private static void notificationBigText(NotificationCompat.Builder newMessageNotification, String bigText) {if (bigText != null && newMessageNotification != null) {newMessageNotification.setStyle(new NotificationCompat.BigTextStyle().bigText(bigText));}}/*** 显示通知** @param context* @param notifyId*/@SuppressLint("ResourceAsColor")public static void showNotification(Context context, int notifyId, NotificationCompat.Builder notificationBuilder, Bitmap bigBitmap, PushBean pushBean) {NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);PendingIntent startActivityIntent = customNotificationByClickStartActivity(context, CommonStartActivityUtils.startActivityByActivityOpen(context, pushBean));if (startActivityIntent != null) {notificationBuilder.setContentIntent(startActivityIntent);notificationBuilder.setContentTitle(pushBean.getPushTitle() + "");notificationBuilder.setContentText(pushBean.getPushContent() + "");//设置通知的小图标
//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && userBitmap != null) {
//                IconCompat withBitmap = IconCompat.createWithBitmap(userBitmap);
//                notificationBuilder.setSmallIcon(withBitmap);
//            } else {
//                //设置右侧头像if (bigBitmap != null)notificationBuilder.setLargeIcon(bigBitmap);notificationBuilder.setSmallIcon(R.drawable.common_app_icon);
//            }//设置点击消失notificationBuilder.setAutoCancel(true);//铃声、闪光、震动均系统默认notificationBuilder.setDefaults(NotificationCompat.DEFAULT_ALL);//设置级别notificationBuilder.setPriority(NotificationCompat.PRIORITY_LOW);notificationBuilder.setChannelId(CHANNEL_ONE_ID);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {// Register the channel with the system. You can't change the importance// or other notification behaviors after this.NotificationChannel notificationChannel = new NotificationChannel(CHANNEL_ONE_ID, "自定义通知", NotificationManager.IMPORTANCE_LOW);notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);//锁屏显示全部通知notificationChannel.setName("自定义通知");notificationChannel.setDescription("接收通知需要您开启应用通知权限");notificationManager.createNotificationChannel(notificationChannel);}try {notificationManager.notify(notifyId, notificationBuilder.build());} catch (Exception e) {e.printStackTrace();}}}

6、PushJobIntentService处理相关逻辑

public class PushJobIntentService extends IntentService {public PushJobIntentService() {super("push_click");}@Overrideprotected void onHandleIntent(@Nullable Intent intent) {if (intent != null) {Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);//判断是否有输入内容if (remoteInput != null) {CharSequence charSequence = remoteInput.getCharSequence("INPUT_TEXT");//获取输入内容//处理相关逻辑,发送回复网络请求}//移除通知栏这条通知cancelNotification(notifyId, context);}}@Overridepublic void onDestroy() {super.onDestroy();}
} 

7、当用户操作通知后,移除通知栏通知

 /*** 清除id** @param notifyId* @param context*/public static void cancelNotification(int notifyId, Context context) {if (context != null) {NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);notificationManager.cancel(notifyId);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/600127.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 9.0 framework层实现app默认全屏显示

1.前言 在9.0的系统rom产品定制化开发中,在对于第三方app全屏显示的功能需求开发中,需要默认app全屏显示,针对这一个要求,就需要在系统启动app 的过程中,在绘制app阶段就设置全屏属性,接下来就实现这个功能 效果图如下: 2.framework层实现app默认全屏显示的核心类 fram…

Vue - 你知道Vue组件之间是如何进行数据传递的吗

难度级别:中级及以上 提问概率:85% 这道题还可以理解为Vue组件之间的数据是如何进行共享的,也可以理解为组件之间是如何通信的,很多人叫法不同,但都是说的同一个意思。我们知道,在Vue单页面应用项目中,所有的组件都是被嵌套在App.vue内…

nginx支持的多种负载均衡策略

目录 1.轮询&#xff08;默认&#xff09; 2. ip_hash 3. 加权轮询&#xff08;weight&#xff09; 4. fair&#xff08;第三方&#xff09; 5. 最少连接&#xff08;least_conn&#xff09; 1.轮询&#xff08;默认&#xff09; 将请求依次分配给每个服务器&#xff0c;确…

thinkphp6中使用监听事件和事件订阅

目录 一&#xff1a;场景介绍 二&#xff1a;事件监听 三&#xff1a;配置订阅 一&#xff1a;场景介绍 在项目开发中有很多这样的场景&#xff0c;比如用户注册完了&#xff0c;需要通知到第三方或者发送消息。用户下单了&#xff0c;需要提示给客服等等。这些场景都有一个…

冯喜运:4.2外汇黄金黄金行情趋势分析,黄金原油独家操作建议。

黄金技术面解析&#xff1a;      黄金目前受俄乌局势和美联储降息预期影响&#xff0c;出现了猛烈拉升上涨&#xff0c;已经成功企稳了2200大关&#xff0c;并且步步新高&#xff0c;不断的刷新历史高位&#xff0c;避险买盘强劲。现在日线连阳拉升再次打开布林上轨空间&a…

Linux——静态库 共享库

1.库文件 1).库文件 库是一组预先编译好的方法的集合; Linux系统存储库的位置一般在/lib 和 /usr/lib (64位系统/usr/lib64) 库的头文件放在/usr/include 2).库的分类 静态库:libxxx.a(命名规则) 共享库:libxxx.so(命名规则) 3).准备文件: //add.c int add(int x,int y) { re…

4.7Qt

自由发挥应用场景实现一个登录窗口界面。 mywidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口相关设置this->setWindowTitle("原神启动");this->setWindowIcon(QIcon("C:\\Users\\17212\\Pict…

外包干了25天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…

【Java】maven是什么?

先看一下基本概念: ①Maven 翻译为"专家"&#xff0c;"内行"是跨平台的项目管理工具。 主要服务于基于Java平台的项目构建&#xff0c;依赖管理和项目信息管理。 ②项目构建 项目构建过程包括【清理项目】→【编译项目】→【测试项目】→【生成测试报…

【JavaEE】Spring Web-MVC

目录 Spring Web MVC 是什么 什么是Serlet 什么是MVC 什么是Spring MVC 使用Spring MVC 建立连接 RequestMapping 请求 传递单个参数 传递多个参数 传递对象 后端参数重命名 传递数组 传递集合 传递JSON数据 获取url参数-pathvariable 上传文件RequestPart 获…

C++【组合模式】

简单介绍 组合模式是一种结构型设计模式&#xff0c; 只有在可以将对象拆分为【树状结构】的情况下使用。并且像使用独立对象一样使用它们。 常用于表示与图形打交道的用户界面组件或代码的层次结构。 基础理解 Q&#xff1a;为什么要用组合模式 &#xff1f; A&#xff1a;在…

SAP操作教程第14期:SAP B1如何进行自定义字段位置设置

服务对于企业而言永远是重中之重&#xff0c;想要提高服务呼叫效率&#xff0c;员工必须能够快速扫描单据和主数据中的重要信息&#xff0c;及时响应客户。那么&#xff0c;拥有适合企业业务流程的表单则是必不可少的前提。 所以&#xff0c;今天我们就来了解一下&#xff0c;在…