Android四大组件之- Service概述

Service是Android中后台运行的组件,分为启动和绑定两种类型。启动服务通过startService()无限期运行,适合长时间任务;绑定服务通过bindService()提供客户端接口交互,仅在绑定时运行。服务可以通过Intent启动或绑定,且可以同时实现两者。关键回调方法包括onStartCommand()、onBind()、onCreate()和onDestroy()。IntentService是简化版的启动服务,处理单一线程的后台任务。为了服务的生命周期管理,应用需在适当时候调用stopSelf()或stopService()。
摘要由CSDN通过智能技术生成

Service 是一个可以在后台执行长时间运行操作而不使用用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行。

服务基本上分为两种形式:

启动

当应用组件(如 Activity)通过调用 startService()
启动服务时,服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响。已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。例如,它可能通过网络下载或上传文件。 操作完成后,服务会自行停止运行。

绑定

当应用组件通过调用 bindService() 绑定到服务时,服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信(IPC) 跨进程执行这些操作。 仅当与另一个应用组件绑定时,绑定服务才会运行。多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。

虽然本文档是分开概括讨论这两种服务,但是您的服务可以同时以这两种方式运行,也就是说,它既可以是启动服务(以无限期运行),也允许绑定。问题只是在于您是否实现了一组回调方法:onStartCommand()(允许组件启动服务)和 onBind()(允许绑定服务)。

无论应用是处于启动状态还是绑定状态,抑或处于启动并且绑定状态,任何应用组件均可像使用活动那样通过调用 Intent 来使用服务(即使此服务来自另一应用)。 不过,您可以通过清单文件将服务声明为私有服务,并阻止其他应用访问。

应重写的最重要的回调方法包括:
1、onStartCommand()

启动服务startService() -> 重写 onStartCommand() 一旦执行此方法,服务即会启动并可在后台无限期运行。 如果已实现此方法,则在服务工作完成后,需要通过调用 stopSelf()或stopService()来停止服务。(如果您只想提供绑定,则无需实现此方法。)

2、onBind()

绑定服务 bindService(),系统将调用此方法onBind()。在此方法的实现中,必须通过返回IBinder提供一个接口,供客户端用来与服务进行通信。请务必实现此方法,但如果并不希望允许绑定,则应返回 null。

3、onCreate()

首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或
onBind()之前)。如果服务已在运行,则不会调用此方法。

4、onDestroy()

当服务不再使用且将被销毁时,系统将调用此方法。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等。 这是服务接收的最后一个调用。

如果组件通过调用 startService()启动服务(这会导致对 onStartCommand()的调用),则服务将一直运行,直到服务使用 stopSelf()自行停止运行,或由其他组件通过调用 stopService()停止它为止。

如果组件是通过调用 bindService()来创建服务(且未调用 onStartCommand()),则服务只会在该组件与其绑定时运行。一旦该服务与所有客户端之间的绑定全部取消,系统便会销毁它。

为了确保应用的安全性,请始终使用显式 Intent 启动或绑定 Service ,且不要为服务声明 Intent 过滤器。

创建启动服务

从传统上讲,可以扩展Service , IntentService两个类

  1. Service
    这是适用于所有服务的基类。扩展此类时,必须创建一个用于执行所有服务工作的新线程,因为默认情况下,服务将使用应用的主线程,这会降低应用正在运行的所有 Activity 的性能。
    扩展 Service类来创建启动服务 :

该基类包含更多代码,但如需同时处理多个启动请求,则更适合使用该基类;
使用 IntentService显著简化了启动服务的实现。但是,若要求服务执行多线程(而不是通过工作队列处理启动请求),则可扩展Service类来处理每个 Intent。为了便于比较,以下提供了 Service 类实现的代码示例,该类执行的工作与使用IntentService的示例完全相同。也就是说,对于每个启动请求,它均使用工作线程执行作业,且每次仅处理一个请求。

以下是使用 Service类的代码示例:

public class HelloService extends Service {
   
    private Looper mServiceLooper;
    private ServiceHandler mServiceHandler;

    private final class ServiceHandler extends Handler {
   
        public ServiceH
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值