我需要无限期地建立TCP连接(尽可能)。不是自己的服务器,所以我们不能改变它的工作方式。这个服务器每分钟都需要一些ping才能知道连接是否存在。如果服务器在几分钟(少于五分钟)后没有收到ping,则会关闭连接和会话。通过这种方式,我需要维护与服务器的TCP连接,并能够在指定的时间段发送ping。
目前我的Android服务标志为“正在进行”,因此Android不应该杀死它(至少通过正常程序)。 Android服务似乎运行良好,ping定期发送。然而,当服务在移动电话(而不是模拟器)上运行并且它变得空闲时,android似乎在CPU休眠时冻结服务,因此TimerTask发送ping停止工作并且连接断开。
我试图通过部分唤醒锁来锁定手机进入睡眠状态并且它解决了问题,但手机消耗的电量过多,这是不可行的。
我注意到AlarmManager可以帮助完成这项任务,所以我想安排一个警报来更新正在运行的服务,然后发送ping。这将使CPU进入休眠状态并发送ping。但是每分钟安排一个警报可能也是如此耗费电量?
目前我还没有测试过这种方法,但是可行吗?是否有更好的方法来保持这种TCP连接?像Gmail这样的Android服务如何解决这类问题?
答案 0 :(得分:11)
我需要与服务器无限期地建立TCP连接。
为什么?
对于初学者来说,技术上是不可能的。用户将在网络之间切换(例如,在WiFi上,故障转移到3G),用户将离开他们有互联网覆盖的区域,用户将打开飞行模式等。
目前,我有一个带有旗帜" on_course"的Android服务。所以Android不应该杀掉它。
没有像" on_course"这样的概念。在Android中。 Android服务可以并且将被用户(任务杀手,管理服务中的强制停止)或操作系统杀死。而且,由于这将是一项永恒的服务,如果用户无法理解其持续提供的价值,将终止您的服务。
我试图通过部分唤醒锁来锁定手机进入睡眠状态并且它解决了问题,但手机消耗的电量过多,这是不可行的。
正确。
我注意到AlarmManager可以帮助完成这项任务,所以我想安排一个警报来更新正在运行的服务,然后发送ping。这将使CPU进入休眠状态并发送ping。我目前还没有测试过这种方法,但是可行吗?
不确定。你仍然会消耗太多电池,恕我直言。请允许您的用户使用多种选项控制您的投票期(例如,10分钟,30分钟,1小时,从不)。
像Gmail这样的Android服务如何解决这类问题?
他们使用C2DM,这是操作系统的一部分,需要大量的工程才能做到正确。在2010年Google I | O大会上有一个关于它的演示 - 视频应该在YouTube上。请注意,他们每隔30分钟IIRC进行一次心跳ping操作,并针对设备处于3G状态的情况进行优化(允许WiFi无线电在不活动后关闭)。
如果您的永久连接目标是实现推送式通信渠道,请考虑使用C2DM。
答案 1 :(得分:2)
您可以在执行ping之前以及在释放唤醒锁之后将部分唤醒锁定从空闲状态唤醒。它将科学地减少电池消耗,它将完成这项工作。另外,尽可能尝试增加ping时间。
答案 2 :(得分:1)
5分钟是ping时间的一小段时间,您是否可以配置服务器以保持连接更长时间? 30分钟或更高的ping是理想的。下面是一个包含后台tcp连接的应用程序示例,它将在传入的tcp流量上从深度睡眠中唤醒设备。 https://github.com/schwiz/android-websocket-example