服务保活是如何做的(进程如何保活)
进程分为:前台进程、可见进程、服务进程、后台进程、空进程。
前台进程:正在使用的程序,一般系统不会杀死前天进程,除非用户强制停止应用或系统内存不足等极端情况才会杀死。
(1)某个进程持有一个正在与用户交互的Activity并且该Activity正处于resume的状态。
(2)某个进程持有一个Service,并且该Service与用户正在交互的Activity绑定。
(3)某个进程持有一个Service,并且该Service调用startForeground()方法使之位于前台运行。
(4)某个进程持有一个Service,并且该Service正在执行它的某个生命周期回调方法,如onCreate()、onStart()或onDestroy()。
(5)某个进程持有一个BroadcastReceiver,并且该BroadcastReceiver正在执行其onReceive()方法。
可见进程:用户正在使用,能看到,但是没有覆盖整个屏幕,只有屏幕的一部分。可见进程不包含任何前台组件,一般系统也是不会杀死可见进程的,除非要在资源吃紧的情况下,要保持某个或多个前台进程存活
服务进程:某个进程中运行着一个Service且该Service是通过startService()启动的,与用户看见的界面没有直接关联。在内存不足以维持所有前台进程和可见进程同时运行的情况下,服务进程会被杀死
后台进程:在用户按了”back”或者”home”后,程序本身看不到了,但是其实还在运行的程序,比如Activity调用了onPause方法,系统可能随时终止它们,回收内存
空进程:没有组件的进程。
系统根据adj判断进程的优先级,以上如果感觉吃力可以不用回答。
保活:
第一种保活:由于系统不会直接搞调前台进程,所以可以用WindowManager偷偷搞一个像素的悬浮窗置于屏幕之上
第二种保活:利用前台服务,如下:
对于 API level < 18 :调用startForeground(ID, new Notification()),发送空的Notification ,图标则不会显示。
对于 API level >= 18:在需要提优先级的service A启动一个InnerService,两个服务同时startForeground,且绑定同样的 ID。Stop 掉InnerService ,这样通知栏图标即被移。
第三种保活:可以开服务互相唤醒。
第四种保活:可以利用Native层循环监控服务死了没,死了就拉活(API21之后就失效了)。
第五种保活:可以通过重写服务自带的onStartCommand,看看活着没,死了就重启拉活。
以上方式对华为手机的保活都是时好时坏,所以有一个终极的保活方式就是接入QQ和微信登陆,在判断登陆的时候写个循,环当用户使用二者或者二者其一存活的时候,就可以利用腾讯提供的登陆服务的SDK接口激活进程。
IntentService和Service有何不同?
1、IntentService是Service的子类,
2、根据需要处理异步请求。
3、客户端通过调用startService(Intent) 发送请求,该Service根据需要启动,使用工作线程处理依次每个Intent,并在停止工作时停止自身。
4、这种“工作队列处理器”模式通常用于从应用程序的主线程中卸载任务。
5、IntentService类的存在是为了简化这种模式。
IntentService如何使用?
1、扩展IntentService并实现onHandleIntent(Intent)
2、IntentService将收到Intents,启动一个工作线程,并根据需要停止该服务。
3、所有请求都在单个工作线程处理
4、它们可能需要很长的时间
5、一次只会处理一个请求。
6、像对多视频的编辑,我们就使用了这种方式
7、一个视频处理完成在后台合成视频的时候就可以处理下个视频并合成
8、当然了缺点就是在这个过程中咱们不能取消任务