Android极光推送处理message遇到的坑解决
作者:似曾相识2022 发布时间:2022-08-08 00:49:32
我相信现在绝大部分App几乎避免不了消息推送,其实原理还是使用了长连接,通过服务端将消息推给客户端。市面上也有不少三方库,例如极光、友盟、个推、阿里等等。今天我就分享一下我在使用极光推送时遇到的坑,希望对大家有所帮助。
极光推送的接入和使用这里就不展开说明,咱们直接进入主题。因为项目使用的是通知栏方式,就是手机会先收到一个通知栏,用户点击通知栏跳转对应页面。
在点击这个通知栏时会触发其中onNotifyMessageOpened方法,后端会把我们所需要的内容放在message中。其实也就是个json字符串,我们拿到后需要通过对它解析拿到我们所需数据。
override fun onNotifyMessageOpened(
context: Context?,
message: NotificationMessage
) {
val title = message.notificationTitle//通知栏标题
val content = message.notificationContent//通知栏内容
val json = message.notificationExtras//推送信息
}
到这里都还一帆风顺,接下来就出现问题了,明明日志获取到了对应信息,但解析后使用却是空:
val fromJson = gson.fromJson(json, Bean::class.java)
我打印了一下json信息:
{"data":"{\"type\":1,\"name\":\"张三\"}"}
很明显,data内部只能识别出一个字符串。所以我们无法拿到内部的type和name属性。经过了解后才知道,后端设置notificationExtras时只能设置为Sting类型,然而notificationExtras已经是实体内的一个属性,所以我们拿到的时候其实json已经被转义了。那么怎么解决呢?其实把data的值再一次通过Gson解析就能拿到数据了。我们这里采取Map来解析:
其实如果使用Gson解析就不会再出现坑,因为使用Map后面还有坑,所以这里接着使用Map来解析。
val map = Gson().fromJson<HashMap<String, Any>>(
fromJson.data,
HashMap::class.java
)
通过上面的json信息其实不难发现,data内部只有两个属性,一个int类型的type,一个Sting类型的name。然而,这里的坑又出现了......
眼尖的同学估计已经发现问题了,一个int类型的数据竟然给我转换成Double类型的数据了,不得不说这很不严谨。难道是自己哪里没操作对吗?最后通过查阅资料发现,这是Gson的坑,不仅仅是int,连Long也会被转换为Double,这一点让人很难接受。如何解决?
自定义Gson的TypeAdapter,具体实现可以查阅资料
抛弃Gson,拥抱阿里,使用FastJson
到此,我们便拿到了期望的数据。这里还要提一点,关于通知消息跳转Acticity栈顶的配置。如果当前正在目标页面,那么我们一定不希望重新创建新的页面,而是希望在当前页面刷新数据即可。所以不要忘记给目标页面配置栈顶模式,重写OnNewIntent方法。
另外,在广播中跳转Activity时,一定不要忘记给Intent设置flags。
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
来源:https://juejin.cn/post/7204841743275540517


猜你喜欢
- 本文实例总结了C#遍历DataSet控件的方法。分享给大家供大家参考。具体方法如下:DataSet控件在.net主要是用来存储数据的,它更像
- 一、前言:垃圾回收:在未来的JDK中可能G1会为ZGC所取代先问自己几个问题:什么是垃圾?垃圾就是堆内存中(范指)没有任何指针指向的对象实体
- 一.什么是泛型当我们不确定数据类型时,我们可以暂时使用一个字母 T代替数据类型。例如写一个方法,但是我们不知道它是传递的是什么数据类型,我们
- 背景项目中要实现横向列表的无限循环滚动,自然而然想到了RecyclerView,但我们常用的RecyclerView是不支持无限循环滚动的,
- C#自己没有Inputbox这个类,但是Inputbox也蛮好用的,所以有两种方法可以使用一:间接调用vb中的Inputbox功能 
- 1. 场景描述本节结合springboot2、springmvc、mybatis、swagger2等,搭建一个完整的增删改查项目,希望通过这
- OpenCV概述OpenCV做为功能强大的计算机视觉开源框架,包含了500多个算法实现,而且还在不断增加,其最新版本已经更新到3.2。其SD
- 本文实例讲述了Android中Matrix用法。分享给大家供大家参考,具体如下:Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方
- 一、简介此游戏是《2D 赛车》的”魔改版“——2.5D 双人
- Eureka大白话解析笔记补录:1.Eureka 介绍Spring Cloud Eureka 是 Spring Clou
- C# ping网络IP 实现网络状态检测的方法public string GetHostNameByIp(string&
- 前面一篇有说道如何在MyEclipse中搭建maven项目,这里将继续介绍如何在搭建好的基础maven项目中引入我们常用的javaweb框架
- 我就废话不多说了,大家还是直接看代码吧~using UnityEngine;using System.Collections; public
- 本文以在chart控件上和窗体上画矩形为例子讲述了C# GDI在控件上绘图的方法。分享给大家供大家参考。具体方法如下:具体的实现方法就不多解
- 一.求两直线交点class Point { double x; do
- /* * 名称:RandomId * 功能:生成随机ID * 作者:冰麟轻武 * 日期:2012年1
- 本文实例为大家分享了java实现马踏棋盘的具体代码,供大家参考,具体内容如下马踏棋盘算法介绍8X8棋盘,马走日字,要求每个方格只进入一次,走
- Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全
- 在项目中,分页是一个项目中必不可少的,它可以防止我们从数据库中进行大量数据查询时速度变慢,提高我们的查询效率。1、定义分页模型:PageMo
- 普通的公有继承class test1{public: test1(int i) :num1(i) {}privat