四大组件——服务(内附IntentService)

启动、停止服务

继承Service,定制一个服务子类

//必须重写的三个方法
@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)

Service的生命周期

四大组件——服务(内附IntentService)_第1张图片
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中创建并运行的线程。

IntentService

用于在服务中需要开启子线程执行任务的时候
集开启线程和自动停止于一身

继承IntentService

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)

你可能感兴趣的:(四大组件,Service)