Service

是一个可以在后台执行长时间运行操作而不是用用户界面的应用组件;例如服务可以处理网络事务、播放音乐、执行文件I/O或与内容提供程序交互;

1.服务启动方式:

1)应用组件(如Activity)通过调用startService启动服务

服务一旦执行,即可在后台无限运行,即使启动服务的组件已被销毁;此时关闭服务的方法有两种:从外部调用stopService和内部调用stopSelf;startService会调用onStartCommand()方法;

2)应用组件通过调用bindService绑定服务来启动服务

多个组件可以同时绑定到一个服务上,但全部取消绑定后,该服务才会被销毁;bindService会调用onBind()方法,通过onBind()方法,可以使组件和服务交互;onBind()回调方法返回的接口有3种方法定义服务IBinder接口:扩展Binder类、使用Messenger、使用AIDL

2.注意

服务在其托管进程的主线程中运行,它既不创建自己的线程,也不再单独的进程中运行(默认情况下,服务于服务声明所在的应用运行与统一进程,而且运行与该应用的主线程中,也可以指定单独的进程)。这意味着,如果服务之星任何CPU密集型工作或组织性操作(例如MP3播放或联网),则应在服务内创建线程来完成这项工作。通过使用单独的线程,可以降低方式“应用无响应(ANR,5s)”错误的风险,而主线程仍可继续专注于运行用户与Activity之间的交互;

3.Service vs IntentService

1)Service

是适用于所有服务的基类。扩展此类时,必须创建一个用于执行所有服务工作的新线程,因为默认情况下,服务将使用应用的主线程,这会降低应用正在运行的所有Activity的性能。可并发处理多个Intent请求

2)IntentService

是Service的子类,它使用工作线程逐一处理所有启动请求。如果不要求服务同时处理多个请求,这是最好的选择。只需要实现onHandleIntent()方法即可,该方法会接受每个启动请求的Intent,使能够执行后台工作。IntentService里有一个handle机制。多次调用IntentService不会产生新的线程,而是将新任务放进messengerQueen里,串行执行。

你可能感兴趣的:(Service)