如何让安卓APP一直在后台运行?
2016-04-23 10:30
429 查看
本文摘自微信公众号“android高心星的私塾”
一 声明
1 网上很多的保活手段,但是不靠谱的居多2 本文只是进行保活知识的推广,不是在教你做永生不死的进程
二 保活手段
1 业界保活手段:黑色保活,灰色保活,白色保活
2 黑色保活:
1 不同的APP进程,用广播相互唤醒,包括利用系统广播进行唤醒2 常见手段:
1 开机,网络切换,拍照,拍视频等利用系统广播唤醒APP
此场景Google已经意识到,在Android N 取消了 拍照,视频,网络切换的广播
2 接入第三方的SDK也会唤醒相应的APP进程
3 假如你手机里装了支付宝,淘宝,UC等阿里系的APP,那么你打开任何一个,都有可能唤醒其他的阿里系的APP
3 白色保活:
就是调用系统的API启动一个前台Service进程,这样会在通知栏生成一个Notification,用户知道哪些进程正在运行4 灰色保活
1 保活领域应用最为广泛,利用系统的漏洞来启动一个前台的Service进程,与“白色保活”不同的是,它不会在通知栏生成一个Notification,用户无法察觉,但是优先级要高于普通的后台进程。2 实现思路
思路一:当API<18,启动前台的Service直接传入new Notification();
思路二:当API >= 18,同时启动两个id相同的前台Service,然后再将后启动的Service做stop处理
代码这样写:
import android.app.Notification; import android.app.Service; import android.content.Intent; import android.os.Build; import android.os.IBinder; /** * APP灰色保活 * Created by fflin on 2016/4/23. */ public class GrayService extends Service { private final static int GRAY_SERVICE_ID = 1001; @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { //API < 18,此方法能有效地隐藏notification的图标 if (Build.VERSION.SDK_INT < 18) { startForeground(GRAY_SERVICE_ID, new Notification()); } else { Intent intent1 = new Intent(this, GrayInnerService.class); startService(intent1); startForeground(GRAY_SERVICE_ID, new Notification()); } return super.onStartCommand(intent, flags, startId); } //给API >= 18 的平台上做灰色保护手段 public class GrayInnerService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { startForeground(GRAY_SERVICE_ID, new Notification()); stopForeground(true); stopSelf(); return super.onStartCommand(intent, flags, startId); } } }
3 检验方法:
首先看系统通知栏有没有Notification,如果没有,就进入手机adb shell模式,输入命令dumpsys activity services PackageName
打印出指定包名的所有进程中的service信息,看下有没有isForground=true的信息,如果有,就说明了该APP使用了灰色保活
4 使用灰色保活手段并不意味着你的应用就能永生不死,只能说提高了进程的优先级,如果应用占用了很大的内存,还是会被回收的
三 进一步理解保活
1进程回收机制
系统出于体验和性能上的考虑,APP在退出后台时系统并不会真正的kill掉这个进程,而是将其缓存起来,打开的应用越多,后台缓存的进程也就越多。在系统内存不足的情况下,系统开始根据自身的一套进程回收机制来判断要回收掉哪些进程,这套杀死进程回收内存的机制叫 Low Memory Killer,它是基于Linux内核的OOM killer机制诞生的,该机制为每个系统分配了一个值,叫做oom_adj,代表了进程的优先级,oom_adj越大,代表优先级越低,越容易被回收,普通APP进程的oom_adj
>=0,系统的可能会小于0.
2 查看oom_adj的值,需要用到两个shell命令
ps | grep 包名
$cat /proc/进程id/oom_adj
3 结果发现,APP推到后台,UI进程的值降低最为明显,因为它占用的内存资源最多,因此,为了避免后台UI进程被杀,需要尽可能的释放一些不用的图片,音频资源
相关文章推荐
- Android中使用socket通信实现消息推送的方法详解
- 一款实用的火车票订票APP--高铁管家
- 转载:Android Studio调试功能使用总结
- Objective-C 类别(category)和扩展(Extension)
- iOS学习笔记41-Swift(一)基础部分
- iOS学习笔记41-Swift(一)基础部分
- iOS字符串的方法
- OD调试一个小程序的思考总结
- Android中利用SurfaceView制作抽奖转盘的全流程攻略
- AndroidStudio如何导入第三方包以及开源库
- Android5.0采用新的CameraAPI
- iOS JSONModel解析数据成Model
- Android ServiceConnection
- Android Volley完全解析(一),初识Volley的基本用法
- iOS开发之微信自动抢红包功能
- iOS开发JSON文件解析数据成Model的过程简单介绍
- 详解Android开发中ContentObserver类的使用
- Android资源文件分类
- Android国内优秀技术博客
- Android 关于自定义TextView的测量