Android开发你应该懂的Android开发经验谈Android开发

Android开发你应该懂的:Service

2017-11-30  本文已影响60人  606fd5f5448c
Android开发你应该懂的.png

一.什么是Service

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

二.Service的实现

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

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

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

三.使用Service

1、创建Service

要创建一个service,你必须创建一个Service类(或某个已存在的子类)的子类.在你的实现中,你应覆写一些处理有关service生命期的关键方面的回调方法并且提供一个能让组件绑定到service的机制(如果需要)。
以下代码是Service创建的示例:

public class MyService extends Service {

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
      return Service.START_NOT_STICKY;
  }

  @Override
  public IBinder onBind(Intent intent) {
    return null;
  }
}

重写的回调方法包括:

• onStartCommand()

系统在其它组件比如activity通过调用"startService()"请求service启动时调用这个方法.一旦这个方法执行,service就启动并且在后台长期运行.如果你实现了它,你需要负责在service完成任务时停止它,通过调用"stopSelf()""stopService()".(如果你只想提供绑定,你不需实现此方法)。

• OnBind()

当组件调用"bindService()"想要绑定到service时(比如想要执行进程间通讯)系统调用此方法.在你的实现中,你必须提供一个返回一个IBinder来以使客户端能够使用它与service通讯,你必须总是实现这个方法,但是如果你不允许绑定,那么你应返回null。

• OnCreate()

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

• OnDestroy()

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

如果一个组件通过调用"startService()"启动一个service(最终导致"onStartCommand()"被调用),之后service会保持运行,直到它通过"stopSelf()"停止自己或另外的组件调用"stopService()"停止它。

如果一个组件调用"bindService()"来创建Service("onStartCommand()"不会被调用),那么service只是运行在绑定期间.一旦service从所有的客户端解除绑定,系统就会杀了它。

2、在manifest中声明Service

跟 Activity(以及其他组件)一样,必须在应用的清单文件中声明所有服务。
要声明service,需要添加一个<service>元素作为<application>元素的儿子.例如:

<manifest ... >
  ...
  <application ... >
      <service android:name=".ExampleService" />
      ...
  </application>
</manifest>

为了确保应用的安全性,最好始终使用显式 Intent 启动或绑Service,且不要为服务声明 Intent 过滤器。
如果想阻止其他应用启动你的服务,可以添加[android:exported]属性并将其设置为 "false"

3、启动Service

通过调用"startService""bindService()"方法启动服务
虽然这两个方法都可以启动Service,但是它们还是有区别的:

  1. startService()

使用"startService()"方法启用服务,访问者与服务之间没有关连,即使访问者退出了,服务仍然运行。

Intent i= new Intent(context, MyService.class);
//携带数据
i.putExtra("KEY1", "Value to be used by the service");
context.startService(i);
  1. bindService()

使用"bindService()"方法启用服务,访问者与服务绑定在了一起,访问者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。

startService()和bindService()区别:

使用"startService()"方法启用服务,只能调用"stopService()"方法结束服务,服务结束时会调用"onDestroy()"方法。
应用组件(如 Activity)可以通过调用"startService()"方法并传递对象(指定服务并包含待使用服务的所有数据)来启动服务。服务通过"onStartCommand()"方法接收此Intent。

四.Service 与 Thread 的区别

1.定义:

Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。

Service是Android的四大组件之一,被用来执行长时间的后台任务。默认情况下Service是运行在主线程中的。

2.区别:

Service是可以独立于Activity运行的任务,当Activity销毁的时候它可以在后台独立运行
例如:假设你想在后台每天备份你的消息,那么你可以使用Service

Thread不可以UI线程中运行,当你想要做一些耗时的网络操作时可以使用它。当Activity销毁时,那么它也会停止。
例如:使用Activity中的Thread来做一些事,当Activity销毁时,要把Thread也停止

Thread可以直接用来执行后台任务,而Service需要再创建一个Thread来执行任务

上一篇 下一篇

猜你喜欢

热点阅读