敞开生长之旅!这是我参与「日新计划 2 月更文应战」的第 25 天,点击检查活动详情

我信任现在绝大部分App几乎避免不了音讯推送,其实原理还是运用了长连接,经过服务端将音讯推给客户端。市面上也有不少三方库,例如极光、友盟、个推、阿里等等。今日我就共享一下我在运用极光推送时遇到的坑,期望对大家有所协助。

极光推送的接入和运用这儿就不展开说明,咱们直接进入主题。由于项目运用的是告诉栏办法,便是手时机先收到一个告诉栏,用户点击告诉栏跳转对应页面。

Android:记极光推中处理message遇到的坑

在点击这个告诉栏时会触发其中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\":\"张三\"}"}

Android:记极光推中处理message遇到的坑

很明显,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。然而,这儿的坑又呈现了……

Android:记极光推中处理message遇到的坑

眼尖的同学估量现已发现问题了,一个int类型的数据竟然给我转换成Double类型的数据了,不得不说这很不严谨。难道是自己哪里没操刁难吗?最终经过查阅材料发现,这是Gson的坑,不仅仅是int,连Long也会被转换为Double,这一点让人很难承受。如何解决?

  • 自定义GsonTypeAdapter,详细实现能够查阅材料
  • 扔掉Gson,拥抱阿里,运用FastJson

到此,咱们便拿到了期望的数据。这儿还要提一点,关于告诉音讯跳转Acticity栈顶的装备。假如当前正在方针页面,那么咱们必定不期望重新创立新的页面,而是期望在当前页面刷新数据即可。所以不要忘记给方针页面装备栈顶模式,重写OnNewIntent办法。

另外,在播送中跳转Activity时,必定不要忘记给Intent设置flags。

intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK

总结

在json解析这块其实经常呈现一些问题,例如后端键名多了一个空格、某个特点的文字格式不对等等。这些虽然要尽量避免,但也难免会产生。这时咱们应该冷静下来分析问题,多打断点。许多问题都会在心细下方便的解决,期望以上共享对大家有所协助!

敞开生长之旅!这是我参与「日新计划 2 月更文应战」的第 25 天,点击检查活动详情