Android入门篇(七) Service生命周期

前面讲完了四大组件中的Activity,这里在讲解一下另一个重要的的组件Service。Service常见的场景可以应用于后台应用的下载,或者是后台的轮询操作。后台执行一些耗时的操作。

Service的启动

service启动的方式主要有两种:

  1. startService启动service
  2. bindService启动service

    两种启动方式的区别:

  3. startService启动Service
  • 首次启动会创建一个Service实例,依次调用onCreate()和onStartCommand()方法,此时Service 进入运行状态,如果再次调用StartService启动Service,将不会再创建新的Service对象, 系统会直接复用前面创建的Service对象,调用它的onStartCommand()方法!
  • Service与它的调用者无必然的联系,就是说当调用者结束了自己的生命周期, 但是只要不调用stopService,那么Service还是会继续运行的!
  • 无论启动了多少次Service,只需调用一次StopService即可停掉Service
  1. BindService启动Service
  • 当首次使用bindService绑定一个Service时,系统会实例化一个Service实例,并调用其onCreate()和onBind()方法,然后调用者就可以通过IBinder和Service进行交互,此后如果再次使用bindService绑定Service,系统不会创建新的Sevice实例,也不会再调用onBind()方法,只会直接把IBinder对象传递给其他后来增加的客户端!
  • 如果我们解除与服务的绑定,只需调用unbindService(),此时onUnbind和onDestory方法将会被调用!这是一个客户端的情况,假如是多个客户端绑定同一个Service的话,情况如下 当一个客户完成和service之间的互动后,它调用 unbindService() 方法来解除绑定。当所有的客户端都和service解除绑定后,系统会销毁service。(除非service也被startService()方法开启)
  • bindService模式下的Service是与调用者相互关联的,在bindService后,一旦调用者销毁,那么Service也立即终止!

Service生命周期

这里进行测试

  • 通过startService方式启动

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void start(View view) {
    Intent intent = new Intent(SecondActivity.this, FirstService.class);
    startService(intent);
    }

    public void stop(View view) {
    Intent intent = new Intent(SecondActivity.this, FirstService.class);
    stopService(intent);
    }
    ```
    首次启动service

    04-25 21:55:17.525 1263-1263/com.isdust.zor.view_learn D/FirstService: onCreate
    04-25 21:55:17.525 1263-1263/com.isdust.zor.view_learn D/FirstService: onStartCommand

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      从日志中可以看出,当start依次调用了oncreate和onStartCommand

    第二次启动service
    `04-25 22:00:34.075 1263-1263/com.isdust.zor.view_learn D/FirstService: onStartCommand
    `
    这里可以视为两次启动了service,看一下stopservice的情况
    `04-25 22:04:37.325 1263-1263/com.isdust.zor.view_learn D/FirstService: onDestroy`
    可以看到只调用了依次destory,因此,可以明确的看出service不会生成多次
    这种情况下,service和activity没有必然的联系。当activitydestroy后,service依然运行。

    * BindService方式

    bindservice时

04-25 22:10:43.005 1263-1263/com.isdust.zor.view_learn D/FirstService: onCreate
04-25 22:10:43.005 1263-1263/com.isdust.zor.view_learn D/FirstService: onBind

1
2
3
可以看到首次bind时,只是调用了onCreate和onBind

unbindService时

04-25 22:20:43.565 1929-1929/com.isdust.zor.view_learn D/FirstService: onUnbind
04-25 22:20:43.565 1929-1929/com.isdust.zor.view_learn D/FirstService: onDestroy
`
可以看到,依次调用了onUnbind和onDestroy

您的支持将鼓励我继续创作