基础

什么是Android中的Serice?

Service是一个长期运行在后台不提供用户界面的组件。

Service听起来像是一个线程,它们有什么区别?

  • 线程独立主线程(UI线程)之外,而Service可以运行在主线程(默认情况下)中,也可以不在其中。
  • 线程一旦被启动,只有满足相应的条件才能停止,而Service开启,可以通过stopService()或者unbindService()来停止。

Service如何启动呢?

  • started : 在组件(例如activity)中调用startService(),一旦启动将会长时间运行在后台,通常started的服务用于执行单个操作并且不需要返回结果给开启者。例如下载,当完成下载,应该调用stopSelf()方法"自杀"。
  • bound : 在组件中调用bindService()方法,bound的服务允许组件发送请求,获取结果,甚至可以进行进程间通信(IPC),当service没有被绑定时,service对象将会被销毁。

Notice: service默认运行在主进程的主线程中,这就意味着如果service要处理耗时操作或者阻塞操作(例如Map3播放,联网,蓝牙连接),应该在服务中开启工作线程来做这些工作,通过这种方式可以减少应用无响应(Application Not Responding ANR)的发生。

Started Service

如何定义Started Service呢?

继承Service或者IntentService
在manifest文件中配置Service

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

Service和IntentService怎么选择使用哪一个呢?

  • 对于单个操作可以使用IntentService,IntentService开启一个工作线程,
    当onHandlentent()函数执行完毕,service就会自杀,部分源码是这样的
	private final class ServiceHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            onHandleIntent((Intent)msg.obj);  //处理完操作就会自杀,
            stopSelf(msg.arg1);
        }
    }  
  • 较复杂逻辑的要继承Service来完成了。
  • IntentService使用比较简单只需实现onHandlentent()方法。

继承Service应该覆写哪些方法呢?

activity开启service执行过程
所以要覆写三个方法。

  public class HelloService extends Service {

  @Override
  public void onCreate() {
    /*在创建Service时执行,如果开启的服务已经再运行,不会调用这个方法*/
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
/**
       *1. 在组件(例如Activity)调用了startService()就会执行此方法,一旦此方法  
	   *   执行,service就会运行在后台,如果你想停止服务需要在组件中  
	   *   调用stopService(),或者在service中调用stopSelf()  
	   *2. 对于返回值必须是下面常量的其中一个:
	   *   START_NOT_STICKY : 当系统杀死该服务,将不会重建这个service的对象。  
	   *   START_NOT_STICKY : 当系统杀死该服务,将会重新创建service,并且调  
	   *                      用onStartCommand()方法,但不会重新提交最后  
	   *                      一次intent,也就是系统调用onStartCommand()  
	   *                      但传入intent为null  
	   *   START_REDELIVER_INTENT: 系统杀死service后,重新创建service并且  
	   *                           调用onStartCommand()并把最后的请求的  
	   *                           intent传入  
	   */
      return START_STICKY;
  }

  /*********************用于绑定服务这里可以返回null****************/
  @Override
  public IBinder onBind(Intent intent) {
      // We don't provide binding, so return null
      return null;
  }

  @Override
  public void onDestroy() {
/*
        *当服务不再被使用时会调用此方法,在此方法中,应该放弃资源比如线程的  
        *注册的监听,等等。  
        */
  }
}

在组件中如何启动started service呢?

使用startService(Intent),并且intent定义方法与开启activity的intent一样有两种方式显式(类名)与隐式(action)。

如何停止started service?

  • stopService(): 组件来停止服务,一般用于防止耗电,避免浪费系统资源 时使用。
  • stopSelf(): 一般用于在onStartCommand()执行一个请求,当执行完相应操作就使用stopSelf()自杀。
  • stopSelf(int): 当在onStartCommand()中执行多个请求时,建议使用此方法,因为这样可以避免当新的请求到来后,关闭了service的情况。

参考文档

参考文档1

updatedupdated2020-06-132020-06-13