android service保活

在平时的Android开发过程中,经常需要实现APP挂后台一直存活不会被系统杀掉进程,这也就是我们常说的service保活。

现在我总结一下我常用的service保活方案:

1、提升service优先级,让它变成前台进程

2、加入电量白名单,跳过电量优化

3、后台循环播放无声音乐

4、定时唤醒CPU或者屏幕

5、加入悬浮窗机制

下面我分开来描述这几种我使用过的方案

第一个提升service优先级,也就是让service变成前台进程,在系统由于内存资源紧张需要清除进程来释放内存时,前台进程是最后才会被清除的,那怎么才能让我们的service变成前台进程呢?其实也简单,在启动service的时候,我们使用startForegroundService方法,在service的oncreate生命周期中,调用startForeground方法,这样会有一个通知栏提示,告知用户有前台进程的service在运行(网上有黑科技可以不显示通知栏)。这样基本实现了前台进程service,当然我们在AndroidManifest中声明service的时候,可以通过指定android:process让service独占一个私有进程,分担主进程的资源,不过如果你需要和service交互,这种方式会导致你需要跨进程调用了。

第二个就是跳过电量优化,在Android6.0之后,开始引入了电池优化机制,监控APP的耗电量,这样长时间后台运行的service会被监测出来,基于电池优化的策略,很可能会被系统自动杀掉。为了跳过这样的限制,Android是提供电池优化白名单的,通过powerManager.isIgnoringBatteryOptimizations(getPackageName())来判断是否已经加入白名单,没有则通过以下代码来弹窗提示用户自主选择:

Intent intent =new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);

intent.setData(Uri.parse("package:" + getPackageName()));

startActivity(intent);

第三个就是后台音乐播放器,这种方式相信很多人都用过,就是通过在service中使用MediaPlayer来循环播放一段音乐,而无声音乐可以做到让用户无感知。

第四个就是定时唤醒CPU,在很多Android设备中,锁屏状态下由于省电策略,会让设备进入休眠,一些操作甚至网络连接都会中断。而如果我们需要使用service在后台长期运行并做某些操作,可能就需要不断唤醒CPU不让其休眠。这主要是通过Android的wake lock机制来实现,调用PowerManager的newWakeLock来创建,你可以把唤醒CPU的操作放入定时任务中,基于你的逻辑定时多久唤醒一次,避免你service的操作被中断

第五个就是加入悬浮窗机制,其实就是为你的APP创建一个悬浮窗在设备界面中,这个悬浮窗是基于你的service创建的,只要悬浮窗还存在,你的service就存活着。不过这种方案需要用户主动赋予权限,APP动态声明权限,很多人为了让用户无感知,会创建一个透明一像素的悬浮窗,但是权限这块是无法绕过的,所以这种方案用的人不多。

以上是我用过的几种service保活方案,在搭载Android原生系统的手机中测试,基本可以达到长时间保活的目的,但是国内众多手机厂商都基于Android进行了深度定制化开发,这些方案在一些Android版本较高的国内厂家手机中效果也不太好,有些手机需要手动设置允许APP后台运行并且锁屏不清理或者跳过电量优化等等。大家对于service保活还有哪些其他方案或者想法,欢迎一起讨论!

你可能感兴趣的:(android service保活)