//必须重写的三个方法
@Override
public void onCreate() {//创建服务时调用,创建完成时将在整个生命周期不再调用。什么时候创建呢?1.在第一次调用startService的时候,检查到该服务没有创建,则创建服务 2.绑定服务的时候,有个自动创建的参数,绑定的时候就要自动创建。
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {//每startServic的时候调用一次
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {//当所有组件都和该服务解绑、stopService、stopself的时候调用
super.onDestroy();
}
然后在调用方(Activity)中进行startService()或者bindService()进行启动服务。
调用unbindService和stopService 或 Service的stopSelf进行停止服务。
通过onBind()方法进行返回对象给调用者,并且通过在Service子类中创建内部类Binder类的子类进行Service功能管理,在调用者方就可以调用service中的方法。
//MyService类中
private DownloadBinder mBinder = new DownloadBinder();
class DownloadBinder extends Binder {
public void startDownload() {
Log.d("MyService StartDownload", "startDownload");
}
public int getProgress() {
Log.d("MyService getProgress", "getProgress execute");
return 0;
}
}
@Override
public IBinder onBind(Intent intent) { //将此对象返回给调用者
return mBinder;
}
调用者(Activity)进行服务绑定、解除绑定
private MyService.DownloadBinder downloadBinder;//声明来自Service的Binder对象
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder service) {//连接成功的时候调用
downloadBinder = (MyService.DownloadBinder)service;
downloadBinder.startDownload();
downloadBinder.getProgress();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {//连接失败的时候调用
}
};
//需要的参数,和谁绑定在一起呀,绑定成功后参数就是通过connection返回可以操作service的对象Binder,最后一个参数是自动创建服务(创建既执行onCreate方法,但是不会执行onStartCommand)
bindService(new Intent(this,MyService.class),connection,BIND_AUTO_CREATE);
unbindService(ServiceConnection connection)
1). 被启动的服务的生命周期:如果一个Service被某个Activity 调用 Context.startService 方法启动,该Service都在后台运行。如果一个Service被startService 方法多次启动,那么onCreate方法只会调用一次,onStartCommand将会被调用多次(对应调用startService的次数),并且系统只会创建Service的一个实例,因此只需要一次stopService调用接能停止服务的运行。
2). 被绑定的服务的生命周期:如果一个Service被某个Activity 调用 Context.bindService 方法绑定启动,不管调用 bindService 调用几次,onCreate方法都只会调用一次,同时onStartCommand方法始终不会被调用。当连接建立之后,Service将会一直运行,除非调用Context.unbindService 断开连接或者之前调用bindService 的 Context 不存在了(如Activity被finish的时候,自然也就没有连接了),系统将会自动停止Service,对应onDestroy将被调用。
3). 被启动又被绑定的服务的生命周期:如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。并且不管如何调用,onCreate始终只会调用一次,对应startService调用多少次,onStartCommand便会调用多少次。同时调用unbindService和stopService 或 Service的stopSelf ,才会执行onDestroy。
4). 当服务被停止时清除服务:当一个Service被终止(1、调用stopService;2、调用stopSelf;3、不再有绑定的连接(没有被启动))时,onDestroy方法将会被调用,在这里你应当做一些清除工作,如停止在Service中创建并运行的线程。
用于在服务中需要开启子线程执行任务的时候
集开启线程和自动停止于一身
public class MyIntentService extends IntentService {
public MyIntentService() {
super("MyIntentService");//用于父类创建线程名称,必须要给
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("MyIntentService", "onDestroy");
}
//实现此抽象方法,将需要在子线程中执行的任务放在该方法中
@Override
protected void onHandleIntent(@Nullable Intent intent) {
Log.d("MyIntentService", "Thread id is " + Thread.currentThread().getId());
}
}
启动方法依然调用startService(Context context,IntentSevice.Class service)