浅谈Service

一开始学习Android都会被告诉Android的四大组件有Activity、Service、Content Provider、Broadcast Receiver。除Service外的三者很早就接触了,并且认为有一点浅薄的理解。但是Service不是。 工作以来没有接触过与Service相关的业务,尝试过理解Service,但一直不是很理解。最近刚好用到,浅浅的记录一下最近的理解。

作用

作为四大组件之一,每个的作用都是不可替代的。Activity负责生命周期,即一个页面从创建到销毁,当前执行到了哪个阶段。Content Provider提供给外部APP一个接口,能够让外部访问内部的数据。Broadcast Receiver提供更大范围的事件Callback,可以接受其他APP的事件回调,甚至是系统状态变化,比如最常用的网络状态、电量。 我一直有一个疑问:“Service做了什么呢?”为什么可以作为最重要的四大组件之一呢? 直到最近需要写下载的代码。\

[Service](https://developer.android.com/reference/android/app/Service?hl=zh-cn) 是一种可在后台执行长时间运行的操作的 应用组件 。不提供界面。启动后,即使用户切换到其他应用,服务也可能会继续运行一段时间。此外,组件可以绑定到服务以与其交互,甚至可以执行进程间通信 (IPC)。例如,服务可以在后台处理网络事务、播放音乐、执行文件 I/O 或与 content provider 交互。

上面的文字是Android Developer官网对Service的描述。Service最重要的作用是——保活。

假设有需要下载的场景,写一个类,类里边调用下载的代码,一样是可以的,但是应用退到后台,很快会被系统杀死,国内魔改AOSP有更严格的策略。执行下载代码时当然不希望APP在后台时就下载了,这时候Service来搞定这件事是合适的。

后台服务

我们的需求只是完成下载就可以,不需要有任何提示,这时候只用一个后台服务,下载完成后执行某些逻辑。

前台服务

需求更复杂一点 ,下载时需要有一个进度条,随着下载的进度不断更新,这时候需要用到前台服务。前台服务要求必须显示Notification。

但是

  1. Android 8开始不允许后台应用运行后台服务;
  2. 创建服务5s内需要显示一条通知,否则停止服务+Crash
  3. Android 12开始不允许后台应用创建前台服务;