码迷,mamicode.com
首页 > 其他好文 > 详细

关于个推的一点想法

时间:2016-12-06 16:40:55      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:问题   androi   start   目录   内存   为什么   责任   长连接   代码   

  最近项目中用到了个推做推送,关于个推的接入步骤官网有很详细的步骤,这里不说,不过正是由于使用个推,引起了一点其他的思考,那就是个推是怎么做到即便把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以下可行)
  1. 用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。
  2. 在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。
  3. 主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。
  • 联系厂商,加入白名单

关于个推的一点想法

标签:问题   androi   start   目录   内存   为什么   责任   长连接   代码   

原文地址:http://www.cnblogs.com/YaoJianXun/p/6138070.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!