Android Service(服务)
一、简介
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 }