最近有需要做手机推送方面的项目,本人以前没做过网络编程也没做过安卓,所以只能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方法
-
catch(SocketException e) {
-
Log.e("PacketReader", e.toString());
-
connection.disconnect();
-
xmppManager.startReconnectionThread();
-
}catch(IOException e) {
-
e.printStackTrace();
-
}
这样就达到了当与服务端失去连接时,客户端能够进行重新连接的效果。后来群里有朋友说在LoginTask方法中加入
getConnection().startKeepAliveThread(xmppManager); 编译就报错,那是因为他用的是第一个版本 ,所有请先下载第二个版本,第二个版本带大神精简过smack源码。 其实心跳机制在官方的asmack中就已经存在,并且在建立XmppConnection的时候就已经启动,但是遗憾的是asmack的开发人员并没有进行异常之后的重连
所有才出现这个困扰大家的问题。
然后是第二个问题,我们刚才下载的这个版本并没有处理这个BUG,其实很简单,群里的高手经解决,就是将org.androidpn.client.Notifier中的notify方法的
- PendingIntent contentIntent = PendingIntent.getActivity(context, 0,intent, PendingIntent.FLAG_UPDATE_CURRENT);
复制代码
改成
- PendingIntent contentIntent = PendingIntent.getActivity(context, random.nextInt(),
- intent, PendingIntent.FLAG_UPDATE_CURRENT);
复制代码
好了,这2个问题基本上就解决了,本人也只是在此将前辈们的经验写一下,方便大家集中修正BUG。其实在碰到框架BUG时,看看框架的源码还是有帮助,可能会有很多不解,但我觉得多多少少还是能看出一点东西来。以后大家碰到什么问题也可以提出来,大家一起研究讨论,集思广益,总比一个人瞎想的强,有什么好的想法也可以拿出来分享。再次谢谢各位前辈。
在网上androidpn上的BUG基本都解决了,也多亏牛人们顶力相助,灰常感谢啊。在这里要说的问题是手机锁屏后,客户端心跳包不再发送了。由于android也接触不是很久,对一些系统的机制不太了解,经过多次测试与分析,才发现了是由于锁屏后CPU处于睡眠状态,线程都被挂起,所以在服务器端设定的闲置时间内收不到心跳包,强制移除用户下线。
OK问题已经找到了就好办多了,既然是被挂起了我们就只有让心跳一直在跑了,不啰嗦了。既而在网上有找到两种方法,第一种是让系统不睡眠,第二种则是使用AlarmManager来做我们的操作,在这里我是用的第二种方案来解决我们的问题的。但这样可能有点费电,暂时只能这样解决了了,不知道大家有木有更好点的解决办法能说出来大家一起研究研究。
1).
-
-
publicvoidacquireWakeLock()
-
{
-
if(null==mWakeLock)
-
{
-
PowerManagerpm=(PowerManager)getSystemService(Context.POWER_SERVICE);
-
mWakeLock=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"NotificationService");
-
if(null!=mWakeLock)
-
{
-
mWakeLock.acquire();
-
}
-
}
-
}
-
-
-
publicvoidreleaseWakeLock()
-
{
-
if(null!=mWakeLock)
-
{
-
mWakeLock.release();
-
mWakeLock=null;
-
}
-
}
-
-
publicvoidacquireWakeLock()
-
{
-
if(null==mWakeLock)
-
{
-
PowerManagerpm=(PowerManager)getSystemService(Context.POWER_SERVICE);
-
mWakeLock=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"NotificationService");
-
if(null!=mWakeLock)
-
{
-
mWakeLock.acquire();
-
}
-
}
-
}
-
-
-
publicvoidreleaseWakeLock()
-
{
-
if(null!=mWakeLock)
-
{
-
mWakeLock.release();
-
mWakeLock=null;
-
}
-
}
2).
-
publicvoidregisterAlarmManager(){
-
am=(AlarmManager)getSystemService(ALARM_SERVICE);
-
pi=PendingIntent.getBroadcast(this,0,newIntent(this,HeartActionBroadCast.class),Intent.FLAG_ACTIVITY_NEW_TASK);
-
longnow=System.currentTimeMillis();
-
am.setInexactRepeating(AlarmManager.RTC_WAKEUP,now,20000,pi);
-
}
原文地址: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方法
-
catch(SocketException e) {
-
Log.e("PacketReader", e.toString());
-
connection.disconnect();
-
xmppManager.startReconnectionThread();
-
}catch(IOException e) {
-
e.printStackTrace();
-
}
这样就达到了当与服务端失去连接时,客户端能够进行重新连接的效果。后来群里有朋友说在LoginTask方法中加入getConnection().startKeepAliveThread(xmppManager); 编译就报错,那是因为他用的是第一个版本 ,所有请先下载第二个版本,第二个版本带大神精简过smack源码。 其实心跳机制在官方的asmack中就已经存在,并且在建立XmppConnection的时候就已经启动,但是遗憾的是asmack的开发人员并没有进行异常之后的重连
所有才出现这个困扰大家的问题。 然后是第二个问题,我们刚才下载的这个版本并没有处理这个BUG,其实很简单,群里的高手经解决,就是将org.androidpn.client.Notifier中的notify方法的
- PendingIntent contentIntent = PendingIntent.getActivity(context, 0,intent, PendingIntent.FLAG_UPDATE_CURRENT);
复制代码
改成
- PendingIntent contentIntent = PendingIntent.getActivity(context, random.nextInt(),
- intent, PendingIntent.FLAG_UPDATE_CURRENT);
复制代码
分享到:
相关推荐
首先, 我们需要下载androidpn-client-0.5.0.zip和androidpn-server-0.5.0-bin.zip。 下载地址:http://sourceforge.net/projects/Androidpn/ 解压两个包,Eclipse导入client,配置好目标平台,打开raw/...
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-0.5.0和androidpn-server-0.5.0-bin
androidpn-server-0.5.0-bin.zip、androidpn-client-0.5.0.zip、androidpn-demoapp-0.5.0.zip全给你们了,不用再去网站翻了
使用Apndroid Push Notification 实现android信息推送,AndroidPn项目是使用XMPP协议实现信息推送的一个开源项目。内涵服务端和客户端源码
androidpn-client-0.5.0 修改后的版本 修改原来的通知操作 为action配置 这样就可以定义自己的操作 action为: org.androidpn.client.NotificationProcess 请看文章: ...
这个是androidpn的客户端...............................
androidpn客户端文件,以及安装说明
androidPn client 自动重连 修改asmack源码
android推送,很不错的例子,下下来看看吧
androidpn-client推送客户端
真正的免费开源安卓推送demo,可以实现实时的web端推送安桌系统
androidpn-client-pc 版本方便压力测试 直接运行Bootstrap类就行了。启动参数 -Xss64k -Xms512M -Xmx512M 将线程数设置小些,这样可以开启很多线程
内含:配置方法一份、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/,未做任何修改。...
androidpn client 消息推送 源码 直接用,可运行
androidpn的client代码