`
longgangbai
  • 浏览: 7325496 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

androidpn的学习研究(五)【转】androidpn-client 常见BUG解决方法

阅读更多

原文地址:http://phonepush.sinaapp.com/forum.php?mod=viewthread&tid=6&extra=page%3D1

      最近有需要做手机推送方面的项目,本人以前没做过网络编程也没做过安卓,所以只能GOOGLE,发现Androidpn用的比较广泛,但Androidpn还不成熟,存在一些BUG。
目前比较困扰大家的BUG主要有:
1.当服务端连续发送多条通知时,客户端都是显示同一条通知内容。
2.服务端重启,客户端也需要重启建立连接。

最后还有一个问题当我们服务器端重启的时候,客户端就无法在连接到服务器了,除非把android后台的服务

关掉,然后重启才行.在XmmpManager中加上如下红色代码就可:

    private void addTask(Runnable runnable) {
        Log.d(LOGTAG, "addTask(runnable)...");
        taskTracker.increase();
        synchronized (taskList) {
            if (taskList.isEmpty() && !running) {
                running = true;
                futureTask = taskSubmitter.submit(runnable);
                if (futureTask == null) {
                    taskTracker.decrease();
                }
            } else {
            //解决服务器端重启后,客户端不能成功连接androidpn服务器
            runTask();

           
                taskList.add(runnable);
            }
        }
        Log.d(LOGTAG, "addTask(runnable)... done");
    }



      由于没有经验,有BUG也只能继续GOOGLE,最终发现http://jclick.iteye.com/blog/1289383 这个TOMCAT版本比较符合项目的需求。在此还是要感谢这位大神,真是造福广大人民群众。在这个版本中主要修复了第二个问题,相信很多朋友都已经看过了这篇BLOG ,但是大神在回复中写错了类名XMPPWriter,所有导致大家并不知道问题是怎么解决的, 其实是修改了org.androidpn.client.XmppManager,org.jivesoftware.smack.PacketWriter(smack源码)这2个类,这个将他2个版本的代码比较一下就可以看出来了,废话了那么多,在此说一下大神解决此问题的方法。代码在
http://phonepush.sinaapp.com/forum.php?mod=viewthread&tid=5&extra=page%3D1篇帖子中已经贴出来了。在org.androidpn.client.XmppManager的LoginTask方法中加了一行代码getConnection().startKeepAliveThread(xmppManager);跟踪进去发现是开启了一个线程发送心跳,当发送失败时捕获异常,客户端每隔一段时间进行重连。
org.jivesoftware.smack.PacketWriter的run方法
Java代码 
  1. catch (SocketException e) {
  2. Log.e("PacketReader", e.toString());
  3. connection.disconnect();
  4. xmppManager.startReconnectionThread();
  5. catch (IOException e) {
  6. e.printStackTrace();
  7. }
这样就达到了当与服务端失去连接时,客户端能够进行重新连接的效果。后来群里有朋友说在LoginTask方法中加入
getConnection().startKeepAliveThread(xmppManager); 编译就报错,那是因为他用的是第一个版本 ,所有请先下载第二个版本,第二个版本带大神精简过smack源码。 其实心跳机制在官方的asmack中就已经存在,并且在建立XmppConnection的时候就已经启动,但是遗憾的是asmack的开发人员并没有进行异常之后的重连 

Java代码 
  1. catch (Exception e) {
  2. // Do nothing
  3. }
所有才出现这个困扰大家的问题。

       然后是第二个问题,我们刚才下载的这个版本并没有处理这个BUG,其实很简单,群里的高手经解决,就是将org.androidpn.client.Notifier中的notify方法的

  1. PendingIntent contentIntent = PendingIntent.getActivity(context, 0,intent, PendingIntent.FLAG_UPDATE_CURRENT);
复制代码
改成
  1. PendingIntent contentIntent = PendingIntent.getActivity(context, random.nextInt(),
  2.                     intent, PendingIntent.FLAG_UPDATE_CURRENT);
复制代码

       好了,这2个问题基本上就解决了,本人也只是在此将前辈们的经验写一下,方便大家集中修正BUG。其实在碰到框架BUG时,看看框架的源码还是有帮助,可能会有很多不解,但我觉得多多少少还是能看出一点东西来。以后大家碰到什么问题也可以提出来,大家一起研究讨论,集思广益,总比一个人瞎想的强,有什么好的想法也可以拿出来分享。再次谢谢各位前辈。


 在网上androidpn上的BUG基本都解决了,也多亏牛人们顶力相助,灰常感谢啊。在这里要说的问题是手机锁屏后,客户端心跳包不再发送了。由于android也接触不是很久,对一些系统的机制不太了解,经过多次测试与分析,才发现了是由于锁屏后CPU处于睡眠状态,线程都被挂起,所以在服务器端设定的闲置时间内收不到心跳包,强制移除用户下线。

      OK问题已经找到了就好办多了,既然是被挂起了我们就只有让心跳一直在跑了,不啰嗦了。既而在网上有找到两种方法,第一种是让系统不睡眠,第二种则是使用AlarmManager来做我们的操作,在这里我是用的第二种方案来解决我们的问题的。但这样可能有点费电,暂时只能这样解决了了,不知道大家有木有更好点的解决办法能说出来大家一起研究研究。

 

1).

 

 

  1. //申请设备电源锁   
  2.     public void acquireWakeLock()  
  3.     {  
  4.         if (null == mWakeLock)  
  5.         {  
  6.             PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);  
  7.             mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "NotificationService");  
  8.             if (null != mWakeLock)  
  9.             {  
  10.                 mWakeLock.acquire();  
  11.             }  
  12.         }  
  13.     }  
  14.       
  15.     //释放设备电源锁   
  16.     public void releaseWakeLock()  
  17.     {  
  18.         if (null != mWakeLock)  
  19.         {  
  20.             mWakeLock.release();  
  21.             mWakeLock = null;  
  22.         }  
  23.     }  
//申请设备电源锁
  	public void acquireWakeLock()
  	{
  		if (null == mWakeLock)
  		{
  			PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
  			mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "NotificationService");
  			if (null != mWakeLock)
  			{
  				mWakeLock.acquire();
  			}
  		}
  	}
  	
  	//释放设备电源锁
  	public void releaseWakeLock()
  	{
  		if (null != mWakeLock)
  		{
  			mWakeLock.release();
  			mWakeLock = null;
  		}
  	}


2).

 

 

 

    public void registerAlarmManager(){
    	am = (AlarmManager)getSystemService(ALARM_SERVICE); 
        pi = PendingIntent.getBroadcast(this, 0, new Intent(this, HeartActionBroadCast.class), Intent.FLAG_ACTIVITY_NEW_TASK);  
        long now = System.currentTimeMillis();  
        am.setInexactRepeating(AlarmManager.RTC_WAKEUP, now, 20000, pi);
    }
 
分享到:
评论
8 楼 longgangbai 2012-10-15  
wenjiefeng 写道

你好,在andrioidpn-client客户端源码里,NotificationDetailsActivity这个类里,下面的参数都是什么意思呢
Intent intent = getIntent();
String notificationId = intent
.getStringExtra(Constants.NOTIFICATION_ID);
String notificationApiKey = intent
.getStringExtra(Constants.NOTIFICATION_API_KEY);
String notificationTitle = intent
.getStringExtra(Constants.NOTIFICATION_TITLE);
String notificationMessage = intent
.getStringExtra(Constants.NOTIFICATION_MESSAGE);
String notificationUri = intent
.getStringExtra(Constants.NOTIFICATION_URI);

疑惑1、 这几个参数代表什么意思呢, notificationId; notificationApiKey; notificationTitle; notificationMessage; notificationUri;
我看源码里好几处都用到这几个参数 ,

疑惑2、 现在服务端已经能将消息推送到服务端了并增加了一些参数,推送的消息里增加了距离distance等参数,该在客户端的哪个类里获取这些值呢


针对疑惑1,我们从源代码可以看出》你所说的几个字段是消息体的几个字段:
客户端消息体类public class NotificationIQ extends IQ 中的字段:

notificationId对应Id为消息的id
notificationApiKey对应消息的apiKey,双方约定的一个鉴权字段
notificationTitle对应消息的title,消息标题主题
notificationMessage对应消息的message,消息的内容
notificationUri对应消息的url,消息的url


针对疑惑2、如果想在消息中添加额外字段,客户端可能需要须修改NotificationIQ中添加的相关的字段,服务端NotificationMO中添加额外功能实现咯







7 楼 wenjiefeng 2012-10-13  

你好,在andrioidpn-client客户端源码里,NotificationDetailsActivity这个类里,下面的参数都是什么意思呢
Intent intent = getIntent();
String notificationId = intent
.getStringExtra(Constants.NOTIFICATION_ID);
String notificationApiKey = intent
.getStringExtra(Constants.NOTIFICATION_API_KEY);
String notificationTitle = intent
.getStringExtra(Constants.NOTIFICATION_TITLE);
String notificationMessage = intent
.getStringExtra(Constants.NOTIFICATION_MESSAGE);
String notificationUri = intent
.getStringExtra(Constants.NOTIFICATION_URI);

疑惑1、 这几个参数代表什么意思呢, notificationId; notificationApiKey; notificationTitle; notificationMessage; notificationUri;
我看源码里好几处都用到这几个参数 ,

疑惑2、 现在服务端已经能将消息推送到服务端了并增加了一些参数,推送的消息里增加了距离distance等参数,该在客户端的哪个类里获取这些值呢
6 楼 longgangbai 2012-09-22  
109492927 写道
你好,我这老是发多条消息,手机里看消息的时候后面的把前面的覆盖了,为什么呢?109492927

我以前做的时候从http://jclick.iteye.com/blog/1289383 这里下载,然后修改部分代码了。可能需要使用源代码调试研究咯
5 楼 109492927 2012-09-19  
你好,我这老是发多条消息,手机里看消息的时候后面的把前面的覆盖了,为什么呢?109492927
4 楼 109492927 2012-09-19  
你好,我下载了你的最新包,我以前推送的时候,比如推送多条,客户端都可以收到,但是看的时候却老是显示最后一条消息。后来下载了你的最新包,还是这个问题,请问是什么原因呢?求教给讲讲哦,我很困惑109492927
3 楼 ysy7116 2012-09-12  
楼主请问能否提供个下载链接或者把客户端和tomcat版本的发给我呢?
我的邮箱是:short7116@gmail.cp,
2 楼 longgangbai 2012-08-22  
frodohao 写道
内容逻辑混乱,问题1跟问题2楼主你搞清楚了吗?

略懂一点,有问题可以沟通哦,哈哈
1 楼 frodohao 2012-08-18  
内容逻辑混乱,问题1跟问题2楼主你搞清楚了吗?

相关推荐

    androidpn-client-0.5.0.zip和androidpn-server-0.5.0-bin.zip

    首先, 我们需要下载androidpn-client-0.5.0.zip和androidpn-server-0.5.0-bin.zip。 下载地址:http://sourceforge.net/projects/Androidpn/ 解压两个包,Eclipse导入client,配置好目标平台,打开raw/...

    androidpn-client-0.5.0 AND androidpn-server-0.5.0

    使用Apndroid Push Notification 实现android信息推送,AndroidPn项目是使用XMPP协议实现信息推送的一个开源项目。内涵服务端和客户端源码

    androidpn-client-0.5.0和androidpn-server-0.5.0-bin

    本文将围绕"androidpn-client-0.5.0"和"androidpn-server-0.5.0-bin"这两个核心组件,深入探讨AndroidPN的工作原理、实现方式以及其在实际应用中的价值。 首先,我们来看客户端组件"androidpn-client-0.5.0"。它是...

    androidpn-server-0.5.0-bin、androidpn-client-0.5.0、androidpn-demoapp-0.5.0

    这个项目包括三个主要组件:服务器端(androidpn-server)、客户端库(androidpn-client)以及一个演示应用(androidpn-demoapp)。我们来逐一解析这些组件及其相关知识点。 1. **AndroidPN-Server-0.5.0-bin**: 这...

    androidpn-client-0.5.0

    "AndroidPN-client-0.5.0"是一个针对Android平台的Push Notification服务的客户端库,主要功能是为了实现设备与服务器之间的即时通信。Push Notification服务在移动应用开发中扮演着重要角色,它允许服务器向已安装...

    androidpn-client-0.5.01.rar和androidpn-server-0.5.0-bin.zip可在真机上运行

    androidpn-server-0.5.0-bin.zip解压后,打卡bin目录下run.bat运行,之后...将androidpn-client-0.5.0解压后导入Eclipse,修改/raw/androidpn.properties中的xmppHost=xxx.xxx.x.xxx,将其修改为PC端的IP,运行项目,OK

    androidpn-client-dragon

    androidpn-client-0.5.0 修改后的版本 修改原来的通知操作 为action配置 这样就可以定义自己的操作 action为: org.androidpn.client.NotificationProcess 请看文章: ...

    androidpn-client-0.5.0.zip

    总的来说,"androidpn-client-0.5.0.zip"为Android开发者提供了一个实现Push Notification功能的工具,通过这个压缩包,开发者可以学习、定制并集成PN服务到他们的应用程序中,从而提高应用的互动性和用户体验。

    androidPn-client

    总之,`androidPn-client`项目是一个利用`asmack`库实现在Android平台上自动重连的PN客户端,它解决了移动环境中网络不稳定的问题,确保了推送通知的及时性和可靠性。对源码的修改是为了更好地适应Android环境,提升...

    androidpn-client-0.5.0.rar

    android推送,很不错的例子,下下来看看吧

    androidpn-server-1.0.0.zip-jre7

    该程序包修改至开源项目androidpn-server-0.0.5,携带jre7(此为windows版本,如要运行在linix,需更换为linix jre7),无需java配置运行环境,实现离线推送功能,支持推送消息有效期设置,服务端能够自主判断消息...

    androidpn-client.zip

    真正的免费开源安卓推送demo,可以实现实时的web端推送安桌系统

    androidpn-client 0.5 推送

    这里的"androidpn-client 0.5.01111"就是客户端的源码包,包含了实现消息推送所需的所有代码。 **二、客户端源码结构与关键组件** 1. **注册过程**:客户端首先需要向服务端注册,通常会提供一个唯一标识(如IMEI...

    androidpn-client-pc(有问题吧CSDN噢)

    本文将深入探讨“androidpn-client-pc”版本,这是一个专为PC环境设计的客户端,用于进行压力测试。在实际操作中,我们发现这个客户端在进行大规模并发测试时具有较高的灵活性和实用性。 首先,我们来了解如何运行...

    androidpn-client推送客户端

    AndroidPN(Android Push Notification)客户端...总之,AndroidPN客户端是实现Android设备推送通知功能的重要工具,涉及了网络通信、消息处理、权限管理等多个技术领域,为开发者提供了高效、可靠的通知推送解决方案。

    androidpn 相关文件

    androidpn xmpp 消息推送 供研究学习使用 项目相关的jar包 androidpn-client-0.5.0,androidpn-server-0.5.0-binmandroidpn-server-0.5.0-src

    androidpn-0.5.0 server+demoapp+client+成功配置方法

    内含:配置方法一份、androidpn-server-0.5.0-bin.zip、androidpn-demoapp-0.5.0-bin.zip、androidpn-client-0.5.0-bin.zip。三个压缩包都是从官网下载http://sourceforge.net/projects/androidpn/,未做任何修改。...

Global site tag (gtag.js) - Google Analytics