最近项目中用到了个推做推送,关于个推的接入步骤官网有很详细的步骤,这里不说,不过正是由于使用个推,引起了一点其他的思考,那就是个推是怎么做到即便把app应用进程在后台杀掉,也能接受到消息。
说到这个问题,先说一个我日常时候android app的一个体会,我们经常打开某一个不常用的应用,打开的同时会弹出很多这个app和其他不常用app的推送消息(注意是其他且不常用的app)。为什么呢?因为好多推送平台都使用了一个叫“看护联盟”的东西。
个推官网上说,个推的sdk可以在后台常驻且不会耗费太多电量。这个是怎么实现的呢?其实android4.0后没有什么应用是能在后台常驻的,手动的杀掉后台或是当内存不够的时候都会让android杀掉后台的sdk。而另一个方面,加入每个app的个推sdk都在后台常驻的话,电量的消耗是难以想象的。所以个推使用了一个很巧妙的方式:就是将所有手机上使用个推的app都共用一条长连接,这样的就保证app再多也只有一条长连接(常驻后台的sdk)。同时加入我们手动清除后台后(事实上我们也不会清理所有后台,有些应用是我们自己设置的后台接受消息),只要有一个我们经常使用的app打开后,那么这条长连接就会生效,那么所有使用个推的app就可以正常接受推送消息,这样就实现了高频应用带动低频应用,给我们一种个推在后台常驻的感觉。
那么如果我们需要自己搞一个进程在后台一直保留,怎么办呢?(强调一点,这个做法是极度不推介的。无论是出于自己app的体验还是考虑到整个android系统的角度,都不推介这样做。安卓手机总是越用越卡很大程度上就是有越来越多的app进程常驻后台,不负责任)。
方法有这么几种:
- Service设置成START_STICKY,kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样
- ?通过 startForeground将进程设置为前台进程,做前台服务,优先级和前台应用一个级别?,除非在系统内存非常缺,否则此进程不会被 kill
- 双进程Service:让2个进程互相保护,其中一个Service被清理后,另外没被清理的进程可以立即重启进程
- QQ黑科技:在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死
- 在已经root的设备下,修改相应的权限文件,将App伪装成系统级的应用(Android4.0系列的一个漏洞,已经确认可行)
- Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。鉴于目前提到的在Android-Service层做双守护都会失败,我们可以fork出c进程,多进程守护。死循环在那检查是否还存在,具体的思路如下(Android5.0以下可行)
- 用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。
- 在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。
- 主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。
- 联系厂商,加入白名单
时间: 2024-10-22 10:54:50