Moosphan/Android-Daily-Interview

2019-07-16:Service如何进行保活?

Moosphan opened this issue · 11 comments

2019-07-16:Service如何进行保活?

保活不了,死球了

做保活的都死球了,比如我

评论我笑出猪叫

百度了下 思路无非是两种
1.提升service进程优先级
2.在service的生命周期内加以处理(重新创建或重新启动)

利用系统广播拉活
利用系统service拉活
利用Native进程拉活<Android5.0以后失效> fork进行监控主进程,利用native拉活
利用JobScheduler机制拉活<Android5.0以后>
利用账号同步机制拉活

  1. 开启一个像素的Activity进行保活
  2. 前台服务
  3. 用系统广播进行相互唤醒
  4. JobScheduler
IT666 commented

1.设置Service优先级,setForground(true)
2.onStartCommand()方法返回START_STICKY
3.设置为系统级应用
4.在onDestory()方法中重新启动Service
5.开启单独的进程

评论我笑出猪叫

百度了下 思路无非是两种
1.提升service进程优先级
2.在service的生命周期内加以处理(重新创建或重新启动)

第二种保证不了系统回收

诱导用户添加白名单
其他的基本都不现实,比如我手机上除了微信和网易云音乐加入白名单,其他(京东,淘宝,美团等)一键清理之后全部死翘翘

保活基本实现不了了,pass

现在系统只要一键清理掉应用 服务也会被清掉而且无法自启动 除非加入白名单

1:跟各大系统厂商建立合作关系,把App加入系统内存清理的白名单

2:白色保活

用startForeground()启动前台服务,这是官方提供的后台保活方式,不足的就是通知栏会常驻一条通知,像360的状态栏。

3:灰色保活

开启前台Service,开启另一个Service将通知栏移除,其oom_adj值还是没变的,这样用户就察觉不到app在后台保活。
用广播唤醒自启,像开机广播、网络切换广播等,但在国产Rom中几乎都被堵上了。
多个app关联唤醒,就像BAT的全家桶,打开一个App的时候会启动、唤醒其他App,包括一些第三方推送也是,对于大多数单独app,比较难以实现。

4:黑色保活

1 像素activity保活方案,监听息屏事件,在息屏时启动个一像素的activity,提升自身优先级;
Service中循环播放一段无声音频,伪装音乐app,播放音乐中的app优先级还是蛮高的,也能很大程度保活效果较好,但耗电量高,谨慎使用;
双进程守护,这在国产rom中几乎没用,因为划掉app会把所有相关进程都杀死。
3、实现过程:

1)、用startForeground()启动前台服务

前台Service,使用startForeground这个Service尽量要轻,不要占用过多的系统资源,否则系统在资源紧张时,照样会将其杀死。

DaemonService.java

可以参考下面的
Android实现进程保活方案解析