Android 四大组件-- Activity,Service,Content Provider, Broadcast receiver
Service 作为 Android 的四大组件之一,还是非常有必要熟练掌握的!

Service 生命周期

Android service 实现后台常驻服务 android的service使用场合_Android

先从 Service 生命周期看起,Service 的生命周期比较有趣的一点是,它的生命周期会根据调用不同的方法启动有不同的表现,具体有两种形式:

  1. 通过 startService(Intent intent) 启动 Service
    生命周期是这样的: onCreate()onStartCommand()onStart()(已经过时)onDestroy()
  2. 通过 bindService(Intent intent,ServiceConnection conn,int flags) 启动 Service
    生命周期是这样的:bindService()、onCreate() 、IBinder onBind(Intent intent)、unBindService()、onDestroy() 方法。

通过 startService 启动

前面说了,通过 startService() 启动 Service 会执行 onCreate()、onStartCommand()、onDestroy() 方法。注意:当调用 startService(Intent intent) 后,之后只执行一次 onCreate() 方法,反复多次调用 startService 后,Service 只会重复执行 onStartCommand onStart()(已经过时) 方法。调用 stopService 后 Service 只执行一次 onDestroy 方法。

可以看到通过这种方式启动 Service ,这个时候的 Service 几乎和 Activity 不能交互(不考虑全局变量的方式),在 Service 里面也没有 getIntent() 方法。

通过 bindService 启动

既然通过 startService 启动的 Service 和 Activity 没有建立联系,那么通过 bindService 来启动 Service,就可以和 Activity 建立联系了,相当于 Service 绑定到了这个 Activity 中了。

bindService启动的服务和调用者之间是典型的client-server模式。调用者是client,service则是server端。service只有一个,但绑定到service上面的client可以有一个或很多个。这里所提到的client指的是组件,比如某个Activity。

client可以通过IBinder接口获取Service实例,从而实现在client端直接调用Service中的方法以实现灵活交互,这在通过startService方法启动中是无法实现的。

bindService启动服务的生命周期与其绑定的client息息相关。client也可以明确调用Context的unbindService()方法与Service解除绑定。当所有的client与service解除绑定的时候,才会调用onUnbind,然后 Service会自行销毁。

通过 bindService(Intent intent ,ServiceConnection connetion,int flag) 启动 Service 后 Service 的正常的生命周期是:onCreate、onBind、ibinder 会作为参数传递到 connect 中的 onServiceConnected 方法中,绑定后,再次执行 bindService Service 什么都不执行。

Activity 在没有 bindService 的情况下,调用 unBindService(ServiceConnection serviceConnection) 是会 crash 的。无论在什么情况下,对于某个 Activity,只能够执行一次 unBindService。因为执行完一次 Service就不再注册 serviceConnection 了,再次 unBinderService 就会出现错误 Service not registered:MainActivityAndroid service 实现后台常驻服务 android的service使用场合_生命周期_02

宿主 Activity 退出,不会正常执行 Service 的 onDestroy 方法。

关于 binSerive(Intent intent,ServiceConnection connection,int flag) 中的参数

  • 第一个参数就是要绑定的 Service 的intent 就不多说了
  • 第二个参数就是 Service 和 Activity 建立联系使用的
  • 标志位,和启动的 Service 的优先级有关,一般就是传入:BIND_AOUT_CREATE 表示在 Activity 和 Service建立关联后自动创建 Service。

关于 Service 启动总结

上面介绍的都是在单独执行 startService 或者 binService 的情况下。

当既执行了 startService 又执行了 binService 的时候(不区分顺序),只有执行过 stopService 和unBindService 的时候(不区分顺序)才执行 onDestroy 方法。

任何一个 Service 在整个应用程序范围内都是通用的
即 MyService 不仅可以和 MainActivity 建立关联,还可以和任何一个 Activity 建立关联。如果 Service 和多个 Activity 绑定,则只有这个 Service 与 所有 Activity 接触绑定后,才会执行 onDestroy 方法。(如果 Activity 被销毁了,也认为 Service 和这个 Activity 解除了绑定)如果在某个 Activity 调用 startService 后,Service 就被启动了,这个时候,无论你在哪个 Activity 内再调用 startService 效果就和上面分析的多次调用 Service 效果是一样的。

Intentservice

IntentService 是继承于 Service 并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作,启动 IntentService 的方式和启动传统 Service 一样,同时,当任务执行完后,IntentService 会自动停止,而不需要我们去手动控制。