Service详解
简介:
Service为Android的四大组件之一。他与Activity有些类似,都是可以在他们的内部进行一些代码程序的执行操作。但是区别在于,Activity是具有界面,可以有UI界面与用户进行交互,但是Service却是运行在后台的操作,他不具备UI界面,总是静静的在后台运行着。所以,如果某个程序需要呈现某个界面就用Activity,如果不需要进行界面的交互,则用Service。
配置与使用
配置和使用Service其实和Activity是一样的。
1.写一个类(例如DemoService),然后继承Service,覆写里面的关于生命周期的方法,其中onBind()方法是必须覆写的。
2.在清单文件中声明这个Service类。
3.启动Service的时候可以使用startService或者bindService。
继承Service
public class DemoService extends Service {
private String TAG = "DemoService";
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG,"onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG,"onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG,"onBind");
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e(TAG,"onDestroy");
}
}
清单文件中配置
<service android:name=".DemoService"></service>
启动Service
Intent intent = new Intent(this,DemoService.class);
startService(intent);
关于Service的启动与停止
在Android5.0之前我们可以通过隐式意图启动,但是在5.0之后,Google要求必须使用显式意图来启动Service。
启动service的方式有两种,startService与bindService。
startService():访问者和service没有进行绑定,如果访问者退出之后,service仍然可以在后台进行运行。例如制作一个音乐播放器,用这种模式启动service,即便Activity退出之后,service仍然可以在后台播放音乐。
bindService():访问者和service进行了绑定,如果访问者退出之后,service也将退出。
如果使用startService()来启动,由于未和访问者进行绑定,所以可以使用stopService()或者stopSelf()来停止在后台运行的service。
如果使用bindService()来启动,由于与访问者进行了绑定,所以只需要将访问者停止掉就可以停止service。
Service生命周期
Service的生命周期即是他覆写的方法。
onCreate():创建Service对象的时候使用,有且只调用一次。我们一般在此方法中进行一些初始化组件的操作。
onStartCommand():每次在使用startService()的时候都会调用此方法,一般在此方法中我们可以进行一些具体的方法操作。
onBind():这是Service必须实现的方法,该方法返回一个IBinder对象,我们可以通过这个对象与Service组件进行通信。
onDestroy():Service被关闭之前会调用这个方法。
onUnBind():当Service绑定的所以客户端都断开连接的时候会会回调这个方法。
和Activity一样,一般都是在onCreate()中进行一些资源的初始化操作,在onDestroy()中进行一些资源的释放操作。
这里我们举个例子,通过startService()方法来启动Service来查看他的声明周期。
假设有两个按钮,点击之后会执行startService()方法和stopService()方法
Intent intent = new Intent(this,DemoService.class);
public void onBtn(View view) {
startService(intent);
}
public void onBtn1(View view){
stopService(intent);
}
Service代码如下:
public class DemoService extends Service {
private String TAG = "DemoService";
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG,"onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG,"onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG,"onBind");
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e(TAG,"onDestroy");
}
}
假设我们先点击按钮一,执行startService()方法,再点击按钮二执行stopService()方法,此时执行的log如下:
onCreat
onStartCommand
onDestroy
如果我们在不关闭Service的情况下,拼命点击三次按钮一,执行startService()方法,log如下:
onCreat
onStartCommand
onStartCommand
onStartCommand
可见在onCreate会创建一个Service对象,如果这个对象不消失,则不会再调用onCreate方法,而只要调用startService()方法,就一定会执行onStartCommand()方法。
所以,当我们使用startService() 启动Service的时候,我们走的生命周期为
onCreate() ——> onStartCommand()——>Service被自己或者调用者停止 ——> onDestroy()
而当我们在使用bindService()启动Service的时候,我们走的生命周期为
onCreate() ——> onBind() ——>调用unBindService()取消绑定 ——>unBind() ——> onDestroy()
上一篇: MySQL_单表查询、多表查询