解读AndroidPN的离线消息处理

本人在项目中用到AndroidPN,达到通过服务器给终端推送消息通知的功能。下面讲下个人对AndroidPN的离线消息处理的理解。

AndroidPN的离线消息需要处理以下几种情况:

1.客户端刚上线的时候,AndroidPN服务器需要在根据上线的用户去检索该用户是否在通知消息表中有未发送(state=0)的消息,如果有,则调用NotificationManager中的sendOfflineNotification方法,发送离线消息;


当时我还没看到AndroidPN中的离线消息这块的处理代码,自己就自己写了一段代码在IQAuthHandler中的handleIQ处理成功后加上了离线消息的处理 ;后来接着研究的时候发现AndroidPN已经加上了跟我一样的处理代码,不过他放的位置跟我的不一样,我的是放在登陆成功后的位置,而源码是放在StanzaHandler处理消息类中的processPresence方法中,同样是对session作了判断,如果session的状态为已经验证,则查询该用的离线消息,再发送离线消息。当时我没明白为什么要放在这个位置,为什么不放在IQAuthHandler中的handleIQ处理登陆成功后,后来我在我解决第二种需要处理AndroidPN的离线消息的时候,才明白源码中为什么要把对离线消息的处理放在StanzaHandler处理消息类中的processPresence方法中。以下就是第二种需要处理离线消息的情况:


2.客户端在线的时候,服务器发送的消息因为某些原因,未能成功发送给客户端,或客户端未能给服务器一个消息接收回执。这时,这条消息在服务器就是state=0,被认为是未发送的消息,这时该怎么处理呢。服务器对离线消息的处理如果放在IQAuthHandler中的handleIQ中的话,如果我们不给第二种离线消息的情况做单独处理,我们只能等第二次用户去登陆服务器的时候,服务器在对客户验证后再推送这个消息。可是这样,消息的实时性就比较差,该怎么办呢。这时,你就会发现服务器把离线消息处理的代码放在StanzaHandler处理消息类中的processPresence方法的精妙之处了。因为,AndroidPN提供了一个心跳检测机制(如果需要对心跳检测详细了解,请参考另一篇文章:http://blog.csdn.net/majian_1987/article/details/9856127),就是在客户端登陆成功后,客户端会定时向服务器发送一个状态消息,以确认客户端与服务器之间的连接有效,发送的状态消息格式如下:

<presence id="FR3E9-28"></presence>
这样,客户端因为心跳检测,需要向服务器发送这么一段消息,服务器在接收这个消息后就会到StanzaHandler处理消息类中的processPresence方法中去处理,在处理完成后,判断session是否有效,如果有效,则根据这个用户去查找是否有这个用户的未发送消息,这时不管这些离线消息是用户登陆之前就存在的还是因为服务器发送失败或客户端未给成功响应回执的消息,都会被重新发送给客户端。


AndroidPN服务器把以上两种情况的离线消息处理,都很巧妙的结合本身提供的心跳检测机制一下给处理了。

你可能感兴趣的:(服务器,AndroidPn)