Android 保活措施

后台进程

  1. 拥有 Activity 处于 onStop

空进程

  1. 不拥有任何活动的组件进程

2. 回收策略

从Zygote fork出来的进程都会被储存在 ActivityManagerService.mLruProcesses 列表中,由ActivityManagerService进行统一管理。ActivityManagerService会根据进程状态去更新进程所对应的 oom_adj 的值,当内存达到一定的阈值会触发清理 oom_adj 高的进程。

参考博客

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3. 保活方案

3.1 提高进程优先级

3.1.1 利用Activity

1像素Activy,监控手机解锁屏事件,解锁时将Activity销毁,锁屏时启动,并且要无感知,在RecentTask里移除

3.1.2 前台服务+Notification

Service 通过 startForegroundService 启动 ,低版本时可以通过特殊方式对 Notification 进行隐藏,高版本无法规避,此方案为通过需求正向解决

3.1.3 引导用户打开电池管理,允许应用后台运行

目前市面上的手机,或多或少都有对进程管理有优化,可能会有允许应用后台允许的功能,但是每款手机的入口均不相同,而且相同厂商的不同版本也会不同

具体做法,找到手机的电池管理或者系统的后台管理,针对不同的手机做文字书面的提醒,提醒用户开启此功能,暴力一点可以想办法拿到此Activity的具体类名 包名等信息,进行反射调用。

此方案一般应用不要使用,工作量巨大,而且仅仅针对提醒类应用使用,比如吃药提醒,起床闹钟,这些对保活要求非常高的应用才适合

3.2 进程死后拉活

3.2.1 监听系统静态广播

低版本时,静态广播可以唤醒应用进程,所以监听系统广播,例如开机,锁屏,解锁等可以做到,但是高版本不能通过静态广播监听系统广播了

3.2.2 监听三方静态广播

与上个方案类似,都是运用静态广播可以拉活应用为基础,只是发送方不是系统,而且三方应用。所以此方案可行,但是很不稳定,海外和国内用户群体不同,手机使用的APK也会不同,而且需要大量反编译三方应用,投成本也很高

3.2.3 利用系统Service机制拉活

Service 的 onStartCommand 返回值,当返回值为 START_STICKYSTART_REDELIVER_INTENT 时,服务会自动重启,但是 Service 在短时间内被杀死5次,则不再拉起

3.2.4 利用 JobScheduler

JobScheduler 为Android 5.0之后引入的,本质是系统定时任务,如果进程被杀,任务仍然会被执行,在7.0后 JobScheduler 添加了限制,最低间隔为15分钟。但是还是有概率出现存在进程死亡后,不触发的情况。

3.2.5 利用 AlarmManager

本质上也是通过设置定时任务,如果进程被杀,任务也仍然会被执行,此时就可以拉活进程。Doze模式会影响 AlarmManager 不被触发,此时要用setAlarmClock来设置。同样有概率出现存在进程死亡后,不触发的情况。

而且Android 9.0的谷歌原生手机,多了一个功能,就是显示手机下一个的闹钟时间是几点,如果用到了这种保活方式,用户也注意到了这个功能,那么闹钟上的时间会暴露有应用在明目张胆的保活

3.2.6 利用账号同步机制

Android 系统的账号同步机制会定期同步账号进行,该方案目的在于利用同步机制进行进程的拉活。添加账号和设置同步周期的代码即可,谷歌商店会查这种保活方案,后果不知,建议慎用

代码参考链接

3.2.7 利用Native进程拉活

利用 Linux 中的 fork 机制创建 Native 进程,在 Native 进程中监控主进程的存活,当主进程挂掉后,在 Native 进程中立即对主进程进行拉活。

感知主进程死亡:在主进程中创建一个监控文件,并且在主进程中持有文件锁。在拉活进程启动后申请文件锁将会被堵塞,一旦可以成功获取到锁,说明主进程挂掉,即可进行拉活。
拉活主进程:通过 Native 进程拉活主进程的部分代码如下,即通过 am 命令进行拉活。通过指定“–include-stopped-packages”参数来拉活主进程处于 forestop 状态的情况。
但是 Android5.0 以上手机 会依次杀死所有进程,也会将 Native 进程杀死

3.2.8 利用双进程拉活

启动两个Service A和B,处于不同进程,然后在A的 onStartCommand 中绑定 B,B也在A的 onStartCommand 中绑定A,通过 ServiceConnection 的回调 onServiceDisconnected ,当绑定断开时,说明另一个进程死亡,于是重新启动死亡的进程(Service),6.0之后保活效果也开始有限,与Natvie进程遇到的问题相似,只有在依次杀死进程的间隔中,有几率拉活

3.3 其他拉活方式

3.3.1 利用系统官方的服务,或者三方服务
  1. 国外可以使用 Firebase 的云端推送
  2. 国内可以使用极光推送等服务
    主要还是依靠,自己应用与其他应用使用相同SDK,然后相同的SDK里面内置了相互唤醒功能,具体保活的效果也是依赖三方SDK的能力

最后

总之啊,家里没矿的同学们,如果你们想以后的日子过得好一些,多想想你们的业余时间怎么安排吧;

技术方面的提升肯定是重中之重,但是技术外的一些“软实力”也不能完全忽视,很多时候升职确实是因为你的技术足够强,但也与你的“软实力”密切相关

在这我也分享一份大佬自己收录整理的 Android学习PDF+架构视频+面试文档+源码笔记 ,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这些都是我闲暇还会反复翻阅并给下属员工学习的精品资料。在脑图中,每个知识点专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。

总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习

相信自己,没有做不到的,只有想不到的

.(img-0yDl35zi-1718856700488)]

[外链图片转存中…(img-0wADDh22-1718856700488)]

相信自己,没有做不到的,只有想不到的

  • 28
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android应用的保活是指保持应用程序在后台持续运行,即使用户切换到其他应用或关闭手机屏幕,也能接收通知、执行定时任务等。在Android中,保活通常是为了实现诸如消息推送接收、位置服务、后台数据同步等功能。 1. **Service和BroadcastReceiver**: - Service:可以通过startService()方法启动长周期的服务,在后台执行耗时操作。但是,系统可能会在空闲时杀死无可见界面的服务,所以需要设置合适的IntentFilter和配置文件(如`<service>`标签)以维持服务。 - BroadcastReceiver:注册一个广播监听器,当特定事件发生时(如定时广播),应用会被唤醒并处理。 2. **JobScheduler**: Android 6.0 (API 23)及以上引入了JobScheduler API,这是一种更官方的方式来安排定期工作,比如数据同步,其优势在于系统会控制资源分配,避免过度消耗电池。 3. **WakeLock**: 使用PowerManager.WakeLock可以防止设备进入休眠状态,但需要谨慎使用,因为它会增加电量消耗。 4. **前台服务和前台任务**: 当应用处于前台模式时,创建前台服务或前台任务可以保证其不会被系统轻易杀死。然而,长时间的前台活动可能导致用户体验变差。 5. **后台运行权限**: 在AndroidManifest.xml中声明<uses-permission> android:name="android.permission.BIND_JOB_SERVICE" 或者 <uses-permission> android:name="android.permission.FOREGROUND_SERVICE",允许应用请求特定的后台权限。 请注意,虽然以上方法可以让应用尽可能地保活,但根据Google Play的规定,过度消耗系统资源的行为可能会导致应用被下架,因此应合理设计策略并考虑用户的体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值