当前位置: 代码迷 >> Android >> 在android下实现心跳包的有关问题
  详细解决方案

在android下实现心跳包的有关问题

热度:81   发布时间:2016-04-27 22:16:06.0
在android下实现心跳包的问题
原来在android写的心跳包,用的是java下的Timer实现的,后来发现,在usb线断开的时候,屏幕关闭的话,Timer就会失效.


后来网上说要用Android下的Alarm,但是感觉实现不了哇,特来求教
/******************************************************** 心跳包部分 ************************************/
// 启动心跳包
public void createHeardbeatConnection(Socket socket, Context ctx,
boolean isRun) {

AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
Intent intent = new Intent(this, AlarmCaller.class);
intent.putExtra("socket", socket);
    PendingIntent sender = PendingIntent.getBroadcast(this, AlarmManager.RTC_WAKEUP, intent, 0);
    
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, System.currentTimeMillis(), 5*1000, sender);
//原来用java下的Timer实现的,但是屏幕关闭了会停掉
    timer = new Timer();
timer.schedule(new HeardBeatTask(socket,ctx,isRun), new Date(),Protocol.HEART_BEAT_TEST_TIME * 60 * 1000);
}



问题:
 功能是写在一个Service里的,PendingIntent要启动另一个Service?那么当前的socket如何传递过去呢?





或者有其它方式实现?





ps. 还有个问题,想让自己的apk动态生成,生成的每一个apk都有自己的一些配置信息,通过java app生成,像exe那种,他们好像是直接把要改的内容写成特定格式,比如aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,然后读这个文件,查找替换,可是apk这种方法实现不了,请问,该如何实现类似功能呢?


------解决思路----------------------
不插USB,屏幕灭了系统会睡的。。
你试下在alarmManager通知后先拿个wakelock
------解决思路----------------------
引用:
Quote: 引用:

我的心跳包一开始是用timer和timeTask来做的,1分钟1次

但查log的时候发现,大概在300毫秒内,连续发了好几个,没找到原因

然后前几天我换了ScheduledExcutorService来做,正在测试中。。。

程序是一个常驻内存的,如果一直不放,是不是一会儿就没电了?

适当的sleep和wait,应该问题不大

现在突然又来一问题,service里的socket,在屏幕关掉的情况下,可以正常的读写数据吗?

不知道你什么系统,我这里一直都可以的



ScheduledExcutorService可以在屏幕关掉了情况下,还继续运行?在没拿到锁的情况下?



我测试两真机,和个是4.0.4(阿里云的小辣椒),测试,屏幕关掉了,就不能收发数据了
          4.2.2(i9500) 测试是完全正常的.
方便加下147654368指导一下吗?


我这边屏幕关掉后短时间内能正常收发数据,但时间一长就不行了

看了昨晚的log,ScheduledExcutorService在长时间待机后也不行。在4-5小时内1次都没执行

我这里还有一个alarm版本的,这个在长时间待机后是能继续稳定执行。但用了alarm问题就和你一样了,alarm和socket配合起来比较麻烦

  相关解决方案