Service是Android四大组件之一,同时也是四大组件中和Activity最相似的组件,都代表着可执行的程序,他们的区别在于Service一直在后台运行,没有用户界面,一旦被启动就和Activiy一样拥有生命周期,一般来说,需要显示界面则使用Activity,不需要则可以选择Service

Activity的生命周期在于用户打开与关闭,从用户打开程序到用户关闭程序之间存在,那么Service呢?他的生命周期在于什么,是否也是在用户的打开与关闭,Service能否一直存在于后台

一般情况下,只有系统自带的应用或者厂商定制的应用拥有比较高的优先级能够保持后台服务一直运行,也就是,可以通过root后给予相应高的权限,理论上可以做到一直存在于后台的服务,那么对于未root的系统呢?

这时候就需要一些小技巧和方法

监听开机事件,显式启动后台服务,设置优先级,使用AlarmManager发送定时任务检查是否运行,如果不允许就重新启动

把service和activity分开,让service开机启动。设置一个broadcastreceiver接受开机信号,使用RECEIVE_BOOT_COMPLETED的permission,然后启动service。activity启动后绑定到service上,通过ipc机制通信,acitivity结束后松绑。注意安装后要手动启动service,不会自动启动,之后重启手机后才会随开机启动。

在内存低的时候系统会自动清理进程,这时候后台service可能会被杀掉。可以在onStartCommand中返回START_STICKY,这样系统有足够多资源的时候,就会重新开启service。

使用startForeground启动后台服务“前台运行”的优先级,类似于手机的音乐播放软件,在打开音乐播放软件时会在通知栏显示一条播放进度通知条,因为它能够使后台服务获取到前台的优先级权限从而避免被系统干掉,这种做法也是官方所推荐的

“AstartedservicecanusethestartForeground(int,Notification)APItoputtheserviceinaforegroundstate,wherethesystemconsidersittobesomethingtheuserisactivelyawareofandthusnotacandidateforkillingwhenlowonmemory.(Itisstilltheoreticallypossiblefortheservicetobekilledunderextremememorypressurefromthecurrentforegroundapplication,butinpracticethisshouldnotbeaconcern.)”

也就是说,其实第四种方法更为方便并且被官方所推荐

而startForeground的使用也是很简单的,只需要修改onCreat的内容,在其中创建Notification对象,然后用调用startForeground(1,Notification)即可实现