一、简介

  Service是Android四大组件之一,也可以称为后台服务。Service是一个可以长期在后台执行而不用提供用户界面的应用组件。服务可由其它应用组件启动,即使切换到其它应用组件,服务依然会在后台继续运行。

  此外,组件可以绑定到服务,并与之进行交互,甚至是执行进程间通信(IPC)。

  例如,服务可以处理网络通信,播放音乐\电影,执行文件I/O,这一切的操作都是在后台进行的。

  服务分为两类,第一类是本地服务(Local Service);第二类为远程服务(Remote Service)。 

二、服务注册

  服务(Service)与Broadcast Receiver(广播)一样在Androidmanifest.xml(清单文件)中注册。

 1 <!-- 服务注册 -->
 2 <!-- exported设置允许其它应用启动此服务 -->
 3 <!-- permission是此服务的权限,只能由符合权限的应用的调用此服务 -->
 4 <service
 5     android:name=".CustomService"
 6     android:exported="false"
 7     android:permission="com.example.SERVICE.TESTDEMO">
 8     <intent-filter>
 9         <action android:name="testdemo"/>
10     </intent-filter>
11 </service>

   

  (1). exported是设置是否允许其它应用启动此服务,默认值是通过是否有intent-filter来设置,有intent-filter为true,反之为false。当为true时,允许其它应用启动此服务。

  (2).android:permission是设置服务权限,只有申请了此权限的应用的才能启动并调用此服务。

三、服务启动

  1. 通过startService启动服务

    startService(...) -> onCreate(...) -> onStartCommand(...) ,服务只能停止一次,通过stopService(...)或者stopSelf()方法停止服务后,会调用onDestory()方法,销毁服务。如果,服务没有被停止、销毁,再次使用startService(...)启动服务时,会从onStartCommand(...)方法开始执行。

  停止服务

    1. stopService(...):通过另一个组件调用此方法停止服务。

    2. stopSelf():通过此方法在服务自身停止本服务。

  服务生命周期

  1. 在调用startService(...)方法启动服务后,服务内部调用方法流程:

    (1). onCreate()方法;

    (2). onStartCommand(Intent intent, int flag, int startId)方法;(允许组件启动服务)

  2. 在调用stopService(...) 方法停止服务后,服务内部调用方法流程:

    (1). onDestroy()方法;// 销毁服务

  PS:在下次再次启动服务(调用startService(...)方法)时,会再次从onCreate(...)方法开始。当然,在服务已经启动了,再次使用startService(...)方法启动服务,就不会从onCreate(...)方法开始执行,因为,服务已经启动了,只会从onStartCommand(...)方法开始。

  特点:使用startService(...)开启服务,服务就和调用者(开启者)没有任何关系了,即使调用者(开启者)退出了或者挂掉了,服务依然在后台运行,不会随着调用者(开启者)退出或者挂掉而结束,只能通过stopService(...)或者服务内部方法stopSelf()方法停止,服务停止立即销毁(就是会调用onDestroy()方法)。并且这种服务开启方式是不能调用服务内部方法的。(startService(...)开启的服务也可以称为远程服务)

  2. 通过bindService启动服务

  通过其它组件与服务进行绑定的方式开启服务。

  使用bindService(...)启动服务是不会调用onStartCommand(...)方法的。

  可以通过unBindService(...)方法停止服务。

  生命周期:

  onCreate() --> onBind() --> unOnBind() --> onDestory()

  特点:使用bindService()方法启动服务,绑定服务后,组件的生命周期结束,服务的生命周期也随之结束,也就是调用者(开启者),退出或者挂掉后,服务也随之结束。通过bindService(...)方法启动绑定的服务,调用者(开启者)可以调用服务的内部方法。(通过bindService(...)开启的服务,也可以称为本地服务)

四、服务(Service)生命周期内所有方法(包括两种开启方式)

 1 public class CustomService extends Service
 2 {
 3     private final static String TAG = "CustomService";
 4 
 5     @Nullable
 6     @Override
 7     public IBinder onBind(Intent intent)
 8     {
 9         Log.d(TAG, "onBind");
10         return null;
11     }
12 
13     @Override
14     public void onRebind(Intent intent)
15     {
16         super.onRebind(intent);
17         Log.d(TAG, "onRebind");
18     }
19 
20     @Override
21     public boolean onUnbind(Intent intent)
22     {
23         Log.d(TAG, "onUnbind");
24         return super.onUnbind(intent);
25     }
26 
27     @Override
28     public void onCreate()
29     {
30         super.onCreate();
31         Log.d(TAG, "onCreate");
32     }
33 
34     @Override
35     public int onStartCommand(Intent intent, int flag, int startId)
36     {
37         Log.d(TAG, "onStartCommand");
38         return super.onStartCommand(intent, flag, startId);
39     }
40 
41     @Override
42     public void onDestroy()
43     {
44         super.onDestroy();
45         Log.d(TAG, "onDestroy");
46     }
47 }