Service的两种启动方式和对应的生命周期
阅读原文时间:2021年04月20日阅读:1

两种启动方式

  1. startService()启动方式:主要用于执行后台计算
  2. bindService()启动方式:主要用于和其它组件的交互
    说明:这两种状态是可以共存的,即一个Service既可以处于启动状态,也可以同时处于绑定状态。

1、启动方式

1、生命周期

2、流程

  1. 第一次调用startService()方法后,首先调用onCreate()和onStartCommand()方法,此时Service进入运行状态;如果这个时候再次调用startService()方法,就不会再创建新的Service对象,而是直接复用已经存在的Service,可以理解为Service是单实例模式,只能在系统中存在一个实例。
  2. 由于启动方式打开的Service和调用者没必然联系,所以调用者destroy之后,Service还是会继续运行的。
  3. Service并不是运行在一个独立的进程中的,而是依赖于创建服务时所在的应用程序进程,当某个应用程序进程被杀死的时候,依赖于该应用程序进程的Service也会被杀掉。
  4. 无论启动了多少次Service,只需调用一次StopService即可停掉Service

3、总结一下:

1.onCreate():该方法在整个生命周期中只会在创建Service时调用一次!
2.onDestory():该方法只会当Service被关闭时会回调一次!
3.onStartCommand(intent,flag,startId):当客户端调用startService(Intent)方法时会回调,可多次调用StartService方法, 但不会再创建新的Service对象,而是继续复用前面产生的Service对象,但会继续回调 onStartCommand()方法!

4、验证一下:

public class MyService extends Service {
    public static final String TAG = "MyService";
    public MyService1() {
    }

    @Override
    public void onCreate() {
        Log.d(TAG, "onCreate: ");
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand: ");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy: ");
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

效果:

2、绑定方式

1、生命周期

2、流程

  1. 首先系统会在调用bindService之后实例化一个Service并绑定,然后紧接着调用onCreate和onBind()方法。
  2. 然后调用者就可以通过IBinder和Service进行交互了,此后如果再次使用bindService绑定Service,系统不会创建新的Sevice实例,也不会再调用onBind()方法,只会直接把IBinder对象传递给其他后来增加的客户端!
  3. 调用unbindService(),此时若只有一个客户端绑定了此服务,那么onUnbind和onDestory方法将会被调用!若是多个客户端绑定同一个Service的话,情况如下 当一个客户完成和service之间的互动后,它调用 unbindService() 方法来解除绑定。当所有的客户端都和service解除绑定后,系统会销毁service。
  4. 绑定模式下的Service和调用者共存亡