作为一名知乎重度使用患者,前几天刷知乎的时候,看到一篇帖子。
怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死?
这样的一款手机应用,就一流氓软件,后台一直有service在跑着,如果功耗很大,而且对用户来说不是很重要的app,很大可能性被用户卸载。
奈何,这几天做的app就有这个需求,一款结合物联网的app,这个app其中的一个功能就是,有个心率记一直检测患者的心率,且手机app能收到这个值,当这个值大于或者小于预定义阀值的时候,会自动拨打电话。所以,把接收心率记的值以及响应事件必须放到service中去做,这个service必须一直在后台运行,设想,如果service挂掉,后果不堪设想。
那就从技术角度来分析如何实现这一功能,例如,微信,qq,我们即使后台结束掉这个应用,可是仍然能受到消息,这是因为手机厂商把这些应用加入系统白名单(有些手机没有加入),手机厂商宁可牺牲掉功耗,性能,也把这些应用加入白名单的原因就是它们的占有率以及市场还有服务。
所以我们Android系统中在没有白名单的情况下,如何做一个任何情况下都不被杀死的应用?答案是不可能完全实现,只能让我们的应用基本不被杀死,如果杀死可以马上重启。
接下来就是实现方法:
Android系统把进程的划为了如下几种(重要性从高到低)
1.1前台进程(Foreground Process):用户正在使用的程序,一般系统是不会杀死前台进程的,除非用户强制停止应用或者系统内存不足等极端情况会杀死。
1.2可见进程(Visible Process):用户正在使用,看得到,但是摸不着,没有覆盖到整个屏幕,只有屏幕的一部分可见进程不包含任何前台组件,一般系统也是不会杀死可见进程的,除非要在资源吃紧的情况下。
1.3服务进程(Service Process):某个进程中运行着一个Service且该Service是通过startService()启动的,与用户看见的界面没有直接关联。在内存不足以维持所有前台进程和可见进程同时运行的情况下,服务进程会被杀死。
1.4后台进程(Background Process):在用户按了”back”或者”home”后,程序本身看不到了,但是其实还在运行的程序,比如Activity调用了onPause方法,系统可能随时终止它们,回收内存。
1.5空进程(Empty Process):某个进程不包含任何活跃的组件时该进程就会被置为空进程,完全没用,直接干掉。
1.创建Service,在Service中的onStartCommand()方法中创建一个Timer,3妙打印一句话“running..........”,当打印这句话,表示service是存活状态。
2.在Service中的( )方法中发送一个广播,表示每次当service销毁的时候,发出一个广播。
3.在广播中重新start Service。
不过这种方法已经淘汰,因为应用被手动杀死的时候,系统不会调用到Service中的onDestroy( )方法,所以也不会发出广播,更不可能重新启动Service。
实现方法:
1.有两个Service:LocalService(我们应用中的service),RemoteService(远程service)。
2.在Android中用AIDL(Android Interface Definition Language)实现IPC操作。用来连接两个进程,或者两个app的方法。
AIDL使用方法:<1>定义AIDL接口(在android中右键new —> AIDL)
<2>在LocalService中为远程服务实现对应的stub
<3>将远程服务暴露给客户程序
3.创建两个service,LocalService就和平常的Service一样。RemoteService中需要加入android:process=":remote'字段。
这样,RemoteService就在"....remote"这个进程中。