Android Service详解(一)

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

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

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

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

Service既可以是启动式服务,也可以是绑定式服务,还可以是启动并且绑定式服务。问题只是在于你是否实现了一组回调方法:onStartCommand()(允许组件启动服务)和onBind()(允许绑定服务)。

任何应用组件均可像使用Activity那样通过调用Intent来使用服务(即使此服务来自另一个应用)。不过,你可以通过清单文件将服务声明为私有服务,并阻止其他应用访问。

Service在其托管进程的主线程中运行,它既不创建自己的线程,也不在单独的进程中运行(除非另行指定)。这意味着,如果Service中将执行耗时操作,则应该在Service内创建新线程来完成这项工作。

要创建服务,你必须创建Service的子类(或者使用它的一个现有子类)。在实现中,你需要重写一些回调方法,应重写的最重要的回调方法包括:
onStartCommand()
当另一个组件(如Activity)通过调用startService()请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。如果你实现此方法,则在服务工作完成后,需要由你通过调用stopSelf()或stopService()来停止服务。(如果你只想提供绑定,则无需实现此方法。)
onBind()
当另一个组件想通过调用bindService()与服务绑定(例如执行RPC)时,系统将调用此方法。在此方法的实现中,你必须通过返回IBinder提供一个接口,供客户端用来与服务进行通信。请务必实现此方法,但如果你并不希望允许绑定,则应返回null。
onCreate()
首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用onStartCommand()或onBind()之前)。如果服务已在运行,则不会调用此方法。
onDestory()
当服务不再使用且将被销毁时,系统将调用此方法。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等。这是服务接收的最后一个调用。

有关Service的更多分析和使用,将在后续博客中继续。

猜你喜欢

转载自blog.csdn.net/zdj_develop/article/details/71334735
今日推荐