『Android』什么是Service

402 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情

👨‍🎓作者简介:一位喜欢写作,计科专业的大三菜鸟

🏡个人主页:starry陆离 的个人主页

如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦

1.什么是Service

Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。

例如,服务可在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序进行交互。

注意:服务在其托管进程的主线程中运行,它既创建自己的线程,也在单独的进程中运行(除非另行指定)。所以在Service中不能进行耗时的操作

2.Service的创建

如要创建服务,必须创建 Service 的子类(或使用它的一个现有子类比如IntentService

  • Service是系统提供的适用于所有服务的基类
  • IntentService是系统提供的 Service 的子类,它会在其工作线程逐一处理所有启动请求

先演示一下通过继承Service类实现服务的创建

  1. 创建一个MyService类继承自系统的Service类
  2. 重写其中的
  3. 在Manifest文件中注册(这是四大组件的共性)

创建一个MyService类继承自系统的Service类

image-20221004104442848

在Manifest文件中注册

image-20221004104500959

因为Service在其托管进程的主线程中运行,所以我们在MainActivity的主线程中实现启动Service的按钮点击监听;启动方法与Activity极其相似,启动Activity是startActivity()方法;而启动Service是startService(intent)方法;

image-20221004104516509

每点击一次启动服务按钮,onStartCommand方法都会调用一次,但是onCreate始终都只调用了一次

image-20221004104814062

3.Service的类型

启动式服务

通过startService()方法启动,服务启动后与启动者不再有关系,如上面的例子就是启动服务,Activity被销毁后,Service还是在后台运行

因此上面的那个案例中我们如果退出了MainActivity,服务的onDestroy()方法也不会执行,服务还是会在后台运行。

绑定式服务

通过 bindService() 方法启动,服务启动后与启动者的生命周期连体,服务的启动者销毁,服务也会被销毁。而且绑定服务可以与启动者相互通信。

下面演示一下绑定服务的启动

首先在Activity中创建一个新的按钮,监听MyBindService的启动

image-20221004120542875

创建一个MyBindService类继承自Service重写其中的几个方法

image-20221004120623517

快速在Manifest中注册服务

image-20221004120735531

在Activity中启动服务,这次我们是通过bindStart()方法启动的,需要传入三个参数

  • 第一个参数是一个 Intent,用于显式命名要绑定的服务。
  • 第二个参数是 ServiceConnection 对象。系统通过调用该对象中的回调方法来传递 IBinder实现通信
  • 第三个参数是指示绑定选项的标记。如要创建尚未处于活动状态的服务,此参数通常应为 BIND_AUTO_CREATE

image-20221004121049407

Android 系统创建启动者与服务之间的连接时,会对 ServiceConnection 调用 onServiceConnected()onServiceConnected() 方法包含一个 IBinder 参数,启动者随后会使用该参数与绑定服务通信。

所以下面我们在MainActivity中实现一个全局的ServiceConnection 对象

image-20221004123357033

这里的 IBinder 参数与我们的MyBindService中的onBind()方法返回的参数是一一对应的。正是通过 IBinder 参数实现了与绑定服务通信

 public IBinder onBind(Intent intent) {
         Log.d(TAG, ":onBind ");
         return null;
     }

image-20221004124349644

在MainActivity中就可以拿到MyBindService中的内部类MyBinder中的test()方法。

image-20221004124643678

运行打印日志发现test方法成功被调用,而且当我们退出MainActvity时,绑定式服务先解绑,然后自动销毁

image-20221004125430142