进程保活
一 内存阀值
概念:手机系统的进程退到后台不会被立即杀死,而是存到内存中,当内存达到一定数值时(其实就是达到内存阀值时)手机会依据自身的一套内存回收机制(low Memory Killer) 杀死进程。
二 adj值
概念:手机内存达到内存阀值时,系统会杀死优先级低的进程,linux系统会给每个进程分配一个数值,用以区分优先级,这个值便是adj值,adj值越小说明进程等级越高越不容易被杀死,反之越容易被杀死。
三 进程分类
1 前台进程 (Foreground process)
(1)用户正在使用的进程 交互的activity处于onresume()方法。
(2)某个进程持有一个Service,并且该Service与用户正在交互的 Activity绑定。
(3)某个进程持有一个Service,并且该Service调startForeground()方法使之位于前台运行。
(4)某个进程持有一个Service,并且该Service正在执行它的某个生命 周期回调方法,比如onCreate()、 onStart()或onDestroy()。
(5)某个进程持有一个BroadcastReceiver,且BroadcastReceiver正在执行其onReceive()方法。
2 可见进程(Visible process)
(1)拥有不在前台 但会用户可见的Activity(不可编辑 但可以看到 执行onPause() 但未执行onStop())
(2)拥有绑定到可见(或前台)Activity 的 Service
3 服务进程(Service process)
(1)进程中含有正在运行的Service 并且该服务是通过startService启动的
4 后台进程(Background process)
(1)退到后台 不可见的正在运行的进程
5 空进城(Empty process)###
(1)进程中没有任何“活跃”的组件
四 保活方案
这是只是降低进程的adj的值,未考虑进程占用内存的方案
1 一个像素的Activity
(1)创建一个只用一个像素大小的Activity 并设置透明
(2)创建一个BroadcastReceiver监听屏幕状态(是否锁屏)
(3)创建一个Service,放到一个独立进程(当前进程的私有进程 proecss:进程名)),开启新的进程已减少内存
(4)在服务中开启一个像素的Activity,监听到屏幕锁屏,可开启activity,解屏 在关闭activity
android5.0之前 手动将应用退出,ActivityMangerService在清理内存杀进程时,只会杀死主进程,不会杀掉子进程,但5.0之后会将主进程所带的自进程 统统杀掉 所以这种方案在5.0之前实用。
2 前台服务
(1)在API level < 18 时,在服务中调用startForground(Id,new Notification())发送一个空窗口,则图标不显示,让用户发现不了
(2)在API level >18 时,则在服务中创建一个子服务(也就是一个子类,也是一个服务) 然后两个服务一起发送具有相同的Id的startForground(id,new Notification()),然后子服务关闭notificaton同时关闭自己,这样主服务还在运行没有关闭,起到了前台服务的作用提高优先级
3 相互唤醒
例如腾讯系的微信和QQ 阿里系的支付宝、淘宝、天猫、UC 这些都可以相互唤醒
4 JobSheduler(作业调度)
1继承系统提供的JobService服务
2通过 JobInfo.Builder添加包名
3通过jobScheduler.schedule(builder.build())设置
api5.0以下通常用Native方式去感知主进程是否存活,感知的方案是轮训或者定时器,这是特别耗电的,5.0以后不支持native方式,所以改用JobShceduler代替。
5 粘性服务
1在Service中可以重写 onStartCommand方法 ,并且必须具有一个整形的返回值 ,如果服务被杀掉,则系统可以通过这个返回值判断来判断如何处理(重新开启服务还是不开启)
6 系统服务
1 继承系统的服务,比如消息通知服务,当有消息通知我们的服务可以接到 然后就可以从其拉起进程