持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情
👨🎓作者简介:一位喜欢写作,计科专业的大三菜鸟
🏡个人主页:starry陆离 的个人主页
如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦
1.什么是Service
Service
是一种可在后台执行长时间运行操作而不提供界面的应用组件。
例如,服务可在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序进行交互。
注意:服务在其托管进程的主线程中运行,它既不创建自己的线程,也不在单独的进程中运行(除非另行指定)。所以在Service中不能进行耗时的操作
2.Service的创建
如要创建服务,必须创建 Service
的子类(或使用它的一个现有子类比如IntentService
)
Service
是系统提供的适用于所有服务的基类IntentService
是系统提供的Service
的子类,它会在其工作线程逐一处理所有启动请求
先演示一下通过继承Service类实现服务的创建
- 创建一个MyService类继承自系统的Service类
- 重写其中的
- 在Manifest文件中注册(这是四大组件的共性)
创建一个MyService类继承自系统的Service类
在Manifest文件中注册
因为Service在其托管进程的主线程中运行,所以我们在MainActivity的主线程中实现启动Service的按钮点击监听;启动方法与Activity极其相似,启动Activity是startActivity()方法;而启动Service是startService(intent)方法;
每点击一次启动服务按钮,onStartCommand方法都会调用一次,但是onCreate始终都只调用了一次
3.Service的类型
启动式服务
通过startService()
方法启动,服务启动后与启动者不再有关系,如上面的例子就是启动服务,Activity被销毁后,Service还是在后台运行
因此上面的那个案例中我们如果退出了MainActivity,服务的onDestroy()方法也不会执行,服务还是会在后台运行。
绑定式服务
通过 bindService()
方法启动,服务启动后与启动者的生命周期连体,服务的启动者销毁,服务也会被销毁。而且绑定服务可以与启动者相互通信。
下面演示一下绑定服务的启动
首先在Activity中创建一个新的按钮,监听MyBindService的启动
创建一个MyBindService类继承自Service重写其中的几个方法
快速在Manifest中注册服务
在Activity中启动服务,这次我们是通过bindStart()方法启动的,需要传入三个参数
- 第一个参数是一个
Intent
,用于显式命名要绑定的服务。 - 第二个参数是
ServiceConnection
对象。系统通过调用该对象中的回调方法来传递IBinder
实现通信 - 第三个参数是指示绑定选项的标记。如要创建尚未处于活动状态的服务,此参数通常应为
BIND_AUTO_CREATE
。
Android 系统创建启动者与服务之间的连接时,会对 ServiceConnection
调用 onServiceConnected()
。onServiceConnected()
方法包含一个 IBinder
参数,启动者随后会使用该参数与绑定服务通信。
所以下面我们在MainActivity中实现一个全局的ServiceConnection
对象
这里的 IBinder
参数与我们的MyBindService中的onBind()方法返回的参数是一一对应的。正是通过 IBinder
参数实现了与绑定服务通信
public IBinder onBind(Intent intent) {
Log.d(TAG, ":onBind ");
return null;
}
在MainActivity中就可以拿到MyBindService中的内部类MyBinder中的test()方法。
运行打印日志发现test方法成功被调用,而且当我们退出MainActvity时,绑定式服务先解绑,然后自动销毁