Android核心主题1------服务2(Service基础、startService()、bindService())

详细内容请参考官网https://developer.android.google.cn/guide/components/services

1. 调用 startService()

  1. 当调用 startService() 方法启动一个服务时,它将触发服务的 onStartCommand() 方法的回调。这是服务的入口点,用于处理服务的启动请求和执行相应的操作。
  2. 在服务的生命周期中,onStartCommand() 方法可能会被多次调用,每次调用都表示一个启动请求。每个启动请求都会传递一个 Intent 对象,其中包含了启动服务时传递的数据或指令。
  3. 在 onStartCommand() 方法中,你可以根据需要执行各种操作,并返回一个整型值来指定服务的行为。以下是 onStartCommand() 方法的返回值选项:
  • START_STICKY:如果服务被意外终止,系统会尝试重新启动服务,并重新传递最后一个 Intent。但是,不会保留之前的传递给服务的任何未处理的 Intent。这在执行周期性任务时很有用。
  • START_NOT_STICKY:如果服务被意外终止,系统不会重新启动服务,直到再次调用 startService() 方法。
  • START_REDELIVER_INTENT:如果服务被意外终止,系统会尝试重新启动服务,并重新传递最后一个 Intent。这意味着,如果在服务终止之前有未处理的 Intent,系统会在服务重新启动后依次传递这些未处理的 Intent。

2. 调用 bindService()

  1. 当调用 bindService() 方法绑定一个服务时,它会触发服务的 onBind() 方法的回调。这是用于建立服务与客户端之间连接的入口点。

  2. 在服务的生命周期中,onBind() 方法只会被调用一次,即在服务首次被绑定时。它返回一个 IBinder 对象,该对象用于客户端与服务进行通信。

  3. 需要注意的是,当调用 bindService() 方法时,服务的 onStartCommand() 方法不会被回调。onStartCommand() 方法只用于处理通过调用 startService() 方法启动服务的请求。

因此,如果想要同时启动服务并绑定到它,你需要分别调用 startService() 和 bindService() 方法,并实现对应的回调方法来处理启动和绑定的逻辑。

3. Android Service基础:

如要创建服务,您必须创建 Service 的子类(或使用它的一个现有子类)。在实现中,您必须重写一些回调方法,从而处理服务生命周期的某些关键方面,并提供一种机制将组件绑定到服务(如适用)。以下是您应重写的最重要的回调方法:

  1. onStartCommand()
    当另一个组件(如 Activity)请求启动服务时,系统会通过调用 startService() 来调用此方法。执行此方法时,服务即会启动并可在后台无限期运行。如果您实现此方法,则在服务工作完成后,您需负责通过调用 stopSelf() 或 stopService() 来停止服务。(如果您只想提供绑定,则无需实现此方法。)
  2. onBind()
    当另一个组件想要与服务绑定(例如执行 RPC)时,系统会通过调用 bindService() 来调用此方法。在此方法的实现中,您必须通过返回 IBinder 提供一个接口,以供客户端用来与服务进行通信。请务必实现此方法;但是,如果您并不希望允许绑定,则应返回 null。
  3. onCreate()
    首次创建服务时,系统会(在调用 onStartCommand() 或 onBind() 之前)调用此方法来执行一次性设置程序。如果服务已在运行,则不会调用此方法。
  4. onDestroy()
    当不再使用服务且准备将其销毁时,系统会调用此方法。服务应通过实现此方法来清理任何资源,如线程、注册的侦听器、接收器等。这是服务接收的最后一个调用。

4. 补充

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

如果组件通过调用 bindService() 来创建服务,且未调用 onStartCommand(),则服务只会在该组件与其绑定时运行。当该服务与其所有组件取消绑定后,系统便会将其销毁。

你可能感兴趣的:(Android,核心主题,android)