• 关于个推的一点想法


      最近项目中用到了个推做推送,关于个推的接入步骤官网有很详细的步骤,这里不说,不过正是由于使用个推,引起了一点其他的思考,那就是个推是怎么做到即便把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. 主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。
    • 联系厂商,加入白名单

    不是闷骚的程序员算不上程序员。我的微信公众号“那点鼻事”,在这里周一到周五每天一篇文章,与技术无关,只哈牛逼。

  • 相关阅读:
    C# Asp.net中简单操作MongoDB数据库(二)
    Windows下使用TeamViewer连接远程服务器,以及解决“远程桌面关闭后TeamViewer不能连接”的问题
    存储过程
    C# 使用MongoDB遇到的问题
    C# Asp.net中简单操作MongoDB数据库(一)
    Windows下MongoDB设置用户、密码
    退役狗也要搬博客
    codeforces840E In a Trap
    uoj207共价大爷游长沙
    bzoj2662: [BeiJing wc2012]冻结 最短路 建图
  • 原文地址:https://www.cnblogs.com/YaoJianXun/p/6138070.html
Copyright © 2020-2023  润新知