Android文档笔记:服务(二)-创建…

应用程序组件调用startService()来启动服务。这导致服务的onStartCommand()回调被调用。组件向服务传递一个intent,可以包含任何数据。

当服务被启动,它将拥有自己独立的生命周期,而不依赖于启动它的组件。

服务必须自我终止:stopSelf()
或者由其它组件停止:stopService()

注意:服务缺省的跑在生命它的应用程序的相同进程的主线程里。为了保证性能,服务中的耗时操作应当另起线程来完成。

通常有两个类被用来创建启动服务:
- Service
> 所有服务的基类
> 再次强调,须另起一个线程来做实际的工作

- IntentService
> 此类通过一个工作线程来处理所有的启动请求,一次处理一个
> 如无并发处理多个请求的需求,此为最佳选项
> 需要实现onHsndleIntent()方法

下面讲述如何用这两种类来实行服务

扩展IntentService类

IntentService类的任务是:
- 创建一个默认的工作线程来处理所有发送到onStartCommand()方法的intent
- 创建一个工作队列,每次传送一个intent到你的onHandleIntent()方法
- 在全部启动请求都被处理之后终止服务。因此你不必调用stopSelf()
- 提供一个默认的onBind()方法实现,返回null
- 提供一个默认的onStartCommand()实现。这个实现将intent送入工作队列

因此,所有你需要做的事情就是实现onHandleIntent()方法来处理客户端交给的任务。当然,需要为这个服务类提供一个小的构造方法。

==========================
public class HelloIntentService extends IntentService {

 
  public HelloIntentService() {
      super("HelloIntentService");
  }

 
  @Override
  protected void onHandleIntent(Intent intent) {
      // Normally we would do some work here, like download a file.
      // For our sample, we just sleep for 5 seconds.
      long endTime = System.currentTimeMillis() + 5*1000;
      while (System.currentTimeMillis() < endTime) {
          synchronized (this) {
              try {
                  wait(endTime - System.currentTimeMillis());
              } catch (Exception e) {
              }
          }
      }
  }
}
==========================

如果一定要覆盖其它回调方法(除了onBind()),记得一定要调用父类方法,以保证工作正常

==========================
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
    return super.onStartCommand(intent,flags,startId);
}
==========================

扩展Service类

多线程执行启动请求
例子(实现与上例同样的功能,利用Handler):http://developer.android.com/guide/components/services.html#ExtendingService

onStartCommand()方法必须返回一个整数。这个证书描述了系统将如何使服务继续,即使服务被系统杀死:
- START_NOT_STICKY
> 如果系统在onStartCommand()返回之后杀死了服务,服务将不会重建,除非还有挂起的intent需要分发。这可以防止在没有必要的时候运行你的服务。

- START_STICKY
> 相反,服务将被重建,onStartCommand()被调用,但是并不重新传递前一个intent,代之以一个空intent。

- START_REDELIVER_INTENT
> 重建服务,冰重传上一个intent。所有挂起的Intent都要按顺序发送。适用于下载文件等。


启动一个服务
- 从活动或其它组件启动服务:调用startService(),传递intent
- 安卓系统调用服务的onStartCommand()方法,并塞给它intent
- 如果服务没有起来,则先调用onCreate()
===
Intent intent = new Intent(this, HelloService.class);
startService(intent);
===

如果服务不提供绑定,传递的intent则只用于发起组件和服务之间通信。
但是,如果需要服务提供返回结果,那么发起服务的组件可以创建一个PendingIntent,附在intent上。该机制提供一个广播。服务可以通过这个广播来发送结果。

停止一个服务

- 一个启动服务必须自我管理生命周期。
- 除非要征用内存,否则系统不会终止和销毁服务。
- 必须自我调用stopSelf()或由其它组件调用stopService(),系统接到请求后会尽快销毁服务
- 如果并发处理多个onStartCommand()请求,那么不能在处理一个开始请求的时候终止服务。因为可能已经接收到一个新的开始请求,这个新请求也会被一同终止。为了避免这个问题,可以用stopSelf(int)方法来确保你的终止请求确实基于最近的开始请求。传入的整数是开始请求的ID。这样,如果服务在你调用stopSelf(int)之前收到了新开始请求,那么ID就匹配不上,而服务也就不会终止。

注意:应用程序终止已经完成任务的service是很重要的,能够避免浪费系统资源和电池的损耗。

你可能感兴趣的:(Android文档笔记:服务(二)-创建…)