最近刚开始做安卓开发,很多细节不太了解。
我写了一个单页面的MainActivity并绑定service的APP。想尽可能保持与服务器端的TCP长链接并定期发送数据。
跌跌撞撞最后使用了AlarmManager设置RTC_WAKEUP唤醒类型重复广播的方式,在接收到自定义广播的时候进行TCP通信。
程序在干净环境下能够连续几天保持后台活跃并与服务器定时通信。但是由于手机厂商对AlarmManager时间间隔的限制,时间间隔5秒的AlarmManager在不同手机上分别被推迟至1分钟1次至5分钟1次不等。为了在使用阶段进行更高密度的TCP通信就想到了在使用阶段切换为Timer,检测到锁屏后切换成AlarmManager保活+通信。
代码修改完后发现一个问题,APP使用状态下通过Timer进行5秒一次的通信任务正常,通过接收锁屏和解锁广播进行Timer和AlarmManager转换也正常,手机锁屏后仍然可以保持长链接。但是当APP被放至后台并且手机不锁屏大概5分钟后,网络连接断开,发现APP已经被回收。
初步分析原因是因为手机虽然设置长时间不锁屏,但是仍然进入了休眠或者回收机制?而APP由于一直没有收到锁屏广播还仍然在使用Timer,没有切换成AlarmManager进行定期唤醒所以被回收掉了?
还望大家不吝赐教
Service保活的这个方式已经没法做了,可能有些手机能够保活,但是大多数都会被系统回收;
之前做推送,发现只有厂商白名单的才能一直保活,所以换成第三方推送了。
如果要做,可能就要像QQ微信那样,用双service来互相唤醒保活了。但是这个我没测试过。
你的分析看起来没什么问题,那是不是可以在app进程被杀掉的时候也切成AlarmManager,或者在Timer被销毁的时候切成AlarmManager
这部分确实有点困难,目前大部分手机需要用户手动设置白名单才可以正常实现定时通信,如果条件允许的话最好用服务器进行定时任务的执行
推荐使用 WorkManager
,这个在原生的系统中,就算是你关机重启,他也会自动执行你之前的预定好的方法的,不过也有着API的要求。
进程保活是很多应用开发者都希望对自己App做的事情,目前除了手机厂商对像微信、QQ之类的大哥级App设置了防被杀白名单之外,是没有其他有效的技术手段能保证一个App进程一直活着不会被杀。如果真的这样的黑科技的话,那么所有的App都使用上了,这些App都在后台干些不安份的事情以及占用着内存不释放,那么我们的手机将会变得非常的恐怖
现在想做这个的确比较难了,因为不管是厂商还是原生安卓都在不断地把权限收紧,只有内部白名单的应用可以实现常驻后台,第三方应用只能通过注册权限,才可以
https://blog.csdn.net/sinat_29874521/category_7430846.html
https://blog.csdn.net/qq_29882585/article/details/110703688