对于IM应用和消息推送服务的开发者来说,在Android机型上的后台保活是个相当头疼的问题。

老板一句:“为什么微信、QQ能收到消息,而你写的APP却不行?”,直接让人崩溃,话说老板你这APP要是整成微信、APP那么牛,直接进手机厂商白名单,还要程序员在这瞎忙活?

好了,抱怨归抱怨,活还得干,不然靠谁养活广大苦逼的程序员?

正因为Android系统版本的差异,也导致了各种保活黑科技的运行效果大相径庭,所以本文正好借此机会,盘点一下当前主流(截止2019年前)的保活黑科技在市面上各版本Android手机上的运行效果,希望能给大家提供一些客观的参考。

其实Android端APP搞保活的目的倒不是为了干什么见不得人的坏事(但不排除动机不纯的开发者),主要是像IM即时通讯应用和资讯类应用等需要搞后台消息推送、运动类应用需要在后台实时监测用户的运动数据等,因为现在越来越多的手机厂商为了省电策略考虑,基本上如果你的应用没有被加入白名单,一旦处于后台就会被系统限制甚至干掉,但使用APP的用户才不听你这些解释——反正“我”就要你的APP能如期正常运行,开发者也是不得已而为之。

以消息推送为例,当APP处于后台或关闭时,消息推送对于某些应用来说非常有用,比如:

1)IM即时通讯聊天应用:聊天消息通知、音视频聊天呼叫等,典型代表有:微信、QQ、易信、米聊、钉钉、Whatsup、Line;

2)新闻资讯应用:最新资讯通知等,典型代表有:网易新闻客户端、腾讯新闻客户端;

3)SNS社交应用:转发/关注/赞等通知,典型代表有:微博、知乎;

4)邮箱客户端:新邮件通知等,典型代表有:QQ邮箱客户端、Foxmail客户端、网易邮箱大师;

5)金融支付应用:收款通知、转账通知等,典型代表有:支付宝、各大银行的手机银行等;

.... ....

在上述的各种应用中,尤其对于用户接触最多、最平常的IM聊天应用或新闻资讯来说,保活和消息推送简直事关APP的“生死”,消息推送这种能力已经被越来越多的APP作为基础能力之一,因为移动互联网时代下,用户的“全时在线”能力非常诱人和强大,能随时随地即时地将各种重要信息推送给用户,无疑是非常有意义的。

题外话:实际上,对于后台消息推送能力,Android原版系统早就内置了系统级推送服务(跟iOS上的APNs服务是一个东西),它就是GCM服务(现在升级为FCM了),但众所周之的原因,谷哥的服务在国内都是用不了的(你懂的)——无奈啊!

主要黑科技方案有:

1)监听广播:监听全局的静态广播,比如时间更新的广播、开机广播、解锁屏、网络状态、解锁加锁亮屏暗屏(3.1版本),高版本需要应用开机后运行一次才能监听这些系统广播,目前此方案失效。可以更换思路,做APP启动后的保活(监听广播启动保活的前台服务);

2)定时器、JobScheduler:假如应用被系统杀死,那么定时器则失效,此方案失效。JobService在5.0,5.1,6.0作用很大,7.0时候有一定影响(可以在电源管理中给APP授权);

3)双进程(NDK方式Fork子进程)、双Service守护:高版本已失效,5.0起系统回收策略改成进程组。双Service方案也改成了应用被杀,任何后台Service无法正常状态运行;

4)提高Service优先级:只能一定程度上缓解Service被立马回收。

针对上述方案,具体的实现思路,通常是这样的:

1)进程拉活:AIDL方式单进程、双进程方式保活Service(最极端的例子就是推送厂商的互相唤醒复活:极光、友盟、以及各大厂商的推送,同派系APP广播互相唤醒:比如今日头条系、阿里系);

2)降低oom_adj的值:常驻通知栏(可通过启动另外一个服务关闭Notification,不对oom_adj值有影响)、使用”1像素“的Activity覆盖在getWindow()的view上(据传某不可言说的IM大厂用过这个方案,虽然他们从未正面承认过)、循环播放无声音频(黑科技,7.0下杀不掉);

3)监听锁屏广播:使Activity始终保持前台;

4)使用自定义锁屏界面:覆盖了系统锁屏界面;

5)创建子进程:通过android:process属性来为Service创建一个进程;

6)白名单:跳转到系统白名单界面让用户自己添加app进入白名单。

使用AIDL绑定方式新建2个Service优先级(防止服务同时被系统杀死)不一样的守护进程互相拉起对方,并在每一个守护进程的ServiceConnection的绑定回调里判断保活Service是否需要重新拉起和对守护线程进行重新绑定。即时通讯开发

后台播放音乐这种保活方法,亲身经历过:

记得当时用的是某运动记步APP,它为了保活就是这么干的。之所以被我发现,是因为在我的Android手机上,每次打开这个APP居然总能莫名其妙听到若有若无的环境噪音样的声音,尤其安静的场所下更明显。我个人估计这个APP里用的保活音频文件,很可能就是程序员在简陋的条件下随手自已录制的,虽然也是不得以为之,但做法确实是有点粗糙。

总结一下,以上方案在当前主流手机上的运行效果

【1】双进程守护方案(基于onStartCommand() return START_STICKY):

1)原生5.0、5.1:原生任务栏滑动清理app,Service会被杀掉,然后被拉起,接着一直存活;

2)金立F100(5.1):一键清理直接杀掉整个app,包括双守护进程。不手动清理情况下,经测试能锁屏存活至少40分钟;

3)华为畅享5x(6.0):一键清理直接杀掉整个app,包括双守护进程。不手动清理下,锁屏只存活10s。结论:双进程守护方案失效;

4)美图m8s(7.1.1):一键清理直接杀掉整个app,包括双守护进程。不清理情况下,锁屏会有被杀过程(9分钟左右被杀),之后重新复活,之后不断被干掉然后又重新复活。结论:双守护进程可在后台不断拉起Service;

5)原生7.0:任务栏清除APP后,Service存活。使用此方案后Service照样存活;

6)LG V30+(7.1.2):不加双进程守护的时候,一键清理无法杀掉服务。加了此方案之后也不能杀掉服务,锁屏存活(测试观察大于50分钟);

7)小米8(8.1):一键清理直接干掉app并且包括双守护进程。不清理情况下,不加守护进程方案与加守护进程方案Service会一直存活,12分钟左右closed。结论:此方案没有起作用。

▲ 结论:除了华为此方案无效以及未更改底层的厂商不起作用外(START_STICKY字段就可以保持Service不被杀)。此方案可以与其他方案混合使用。

【2】监听锁屏广播打开1像素Activity(基于onStartCommand() return START_STICKY):

1)原生5.0、5.1:锁屏后3s服务被干掉然后重启(START_STICKY字段起作用);

2)华为畅享5x(6.0):锁屏只存活4s。结论:方案失效;

3)美图m8s(7.1.1):同原生5.0;

4)原生7.0:同美图m8s;

5)LG V30+(7.1.2):锁屏后情况跟不加情况一致,服务一致保持运行,结论:此方案不起作用;

6)小米8(8.1):关屏过2s之后app全部被干掉。结论:此方案没有起作用。

▲ 结论:此方案无效果。

【3】故意在后台播放无声的音乐(基于onStartCommand() return START_STICKY):

1)原生5.0、5.1:锁屏后3s服务被干掉然后重启(START_STICKY字段起作用);

2)华为畅享5x(6.0):一键清理后服务依然存活,需要单独清理才可杀掉服务,锁屏8分钟后依然存活。结论:此方案适用;

3)美图m8s(7.1.1):同5.0;

4)原生7.0:任务管理器中关闭APP后服务被干掉,大概过3s会重新复活(同仅START_STICKY字段模式)。结论:看不出此方案有没有其作用;

5)LG V30+(7.1.2):使用此方案前后效果一致。结论:此方案不起作用;

6)小米8(8.1):一键清理可以杀掉服务。锁屏后保活超过20分钟。

▲ 结论:成功对华为手机保活。小米8下也成功突破20分钟。

【4】使用JobScheduler唤醒Service(基于onStartCommand() return START_STICKY):

1)原生5.0、5.1:任务管理器中干掉APP,服务会在周期时间后重新启动。结论:此方案起作用;

2)华为畅享5x(6.0):一键清理直接杀掉APP,过12s左右会自动重启服务,JobScheduler起作用;

3)美图m8s(7.1.1):一键清理直接杀掉APP,无法自动重启;

4)原生7.0:同美图m8s(7.1.1);

5)小米8(8.1):同美图m8s(7.1.1)。

▲ 结论:只对5.0,5.1、6.0起作用。

【5】混合使用的效果,并且在通知栏弹出通知:

1)原生5.0、5.1:任务管理器中干掉APP,服务会在周期时间后重新启动。锁屏超过11分钟存活;

2)华为畅享5x(6.0):一键清理后服务依然存活,需要单独清理才可杀掉服务。结论:方案适用;

3)美图m8s(7.1.1):一键清理APP会被杀掉。正常情况下锁屏后服务依然存活;

4)原生7.0:任务管理器中关闭APP后服务被干掉,过2s会重新复活;

5)小米8(8.1):一键清理可以杀掉服务,锁屏下后台保活时间超过38分钟;

6)荣耀10(8.0):一键清理杀掉服务,锁屏下后台保活时间超过23分钟。

盘点im即时通讯开发中Android后台保活方案相关推荐

  1. 全面盘点当前Android后台保活方案的真实运行效果(截止2019年前)

    全面盘点当前Android后台保活方案的真实运行效果(截止2019年前) 本文原作者"minminaya",作者网站:minminaya.cn,为了提升文章品质,即时通讯网对内容作 ...

  2. 浅析即时通讯开发中移动端实时消息推送技术

    实时消息推送在移动端互联网时代很平常,也很重要,它的存在让智能终端真正成为全时信息传播的工具.本文将从移动端无线网络的特点来谈谈实时消息推送的技术原理及相关问题,希望能给你带来些许启发. 移动端实时消 ...

  3. android系统应用保活_2020年了,Android后台保活还有戏吗?看我如何优雅的实现!...

    1.引言 对于移动端IM应用和消息推送应用的开发者来说,Android后台保活这件事是再熟悉不过了. 自从Android P(即Android 8.0)出现以后,Android已经从系统层面将后台保活 ...

  4. Android 即时通讯开发小结(二)

    <Android 即时通讯开发小结>基于IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,对 IM 开发做一个全面的总结. 相关推荐阅读:. Android即时通讯 ...

  5. Android后台保活实践总结:即时通讯应用无法根治的“顽疾”

    前言 Android进程和Service的保活,是困扰Android开发人员的一大顽疾.因涉及到省电和内存管理策略,各厂商基于自家的理解,在自已ROOM发布时都会对标准Android发行版作或多或少的 ...

  6. Android 即时通讯开发小结(一)

    本文将基于 IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,对 IM 开发做一个全面的总结. 客户端架构 作为一个 IM 软件,最重要的一个特性就是保证消息的达到率和实时性. ...

  7. im即时通讯开发之后台应用保活、消息推送的噩梦

    Android P的最后一个开发者预览版(即DP5)已如期发布于2018年7月26日,根据上面这张发布路线图,相信Android P的正式版将很快到来.对于Andriod开发者来说,不管Andriod ...

  8. im即时通讯开发:IM系统中离线消息、历史消息实践

    在如今的移动互联网时代,IM类产品已是我们生活中不可或缺的组成部分.像微信.钉钉.QQ等是典型的以 IM 为核心功能的社交产品.另外也有一些应用虽然IM功能不是核心,但IM能力也是其整个应用极其重要的 ...

  9. im即时通讯开发:进程被杀底层原理、APP应对被杀技巧

    本文的技术原理讲解透彻.系统源码分享到位.样例代码也很有参考意义,希望能对有同样兴趣爱好的Android开发者.IM开发者.推送系统开发者等,带来对于Android进程保活技术的深入理解. 一直以来, ...

最新文章

  1. 华为什么时候开始升级鸿蒙,鸿蒙什么时候开放升级?华为又食言了,官方宣布延期到六月...
  2. D3DXCOLOR 和 D3DCOLOR 和 D3DCOLORVALUE
  3. DELPHI参数几个概念上的区别 收藏
  4. 训练残骸模式– Java 8中的改进实现
  5. 新 CEO 谈论GitHub 被微软接管后的未来
  6. 3.12 - Tuples in Python
  7. CMU 15-213 Introduction to Computer Systems学习笔记(23) Thread-Level Parallelism
  8. Java中的重载(overloading)和重写(overriding)
  9. MindMaster Pro 7.2中文版 — 亿图思维导图
  10. 基于范德蒙矩阵的Erasure code技术详解
  11. C64x的软件优化方法
  12. 短网址防封的原理是什么?
  13. KPPW系统—开源免费的威客建站系统
  14. 【小程序测试】小程序介绍,项目简介
  15. 08-02-loggin-模块
  16. 程序员年底失业,到底是该年前找工作好还是年后找工作好?
  17. 【强化记忆】生物选修三填空题考点强化记忆2-胚胎工程、安全伦理问题、生态工程——2017年2月25日...
  18. DEJA_VU3D - Cesium功能集 之 078-对象材质:图片轨迹线
  19. 想要了解大厂PM吗,来看看这几款软件
  20. eclipse安装图形界面插件

热门文章

  1. CentOS7-Docker 网络-06
  2. 以开发之名 | bilibili会员购让IP在眼前动起来
  3. vb.net datetimepicker月到当日的天数_听丨6月30日,黄石人的公积金有大变化
  4. Django 开发环境与生产环境的区分详解
  5. 2017 JavaOne参会感想
  6. 开发消费Linux桌面系统困难重重
  7. 分享一个有关Android从小白到资深工程师的故事
  8. java计算机毕业设计仓储ERP系统源码+数据库+系统+lw文档+部署
  9. [附源码]计算机毕业设计基于Springboot甜品购物网站
  10. LG擎天柱540亿吨