服务(Service) 是一种在后台运行,没有界面的组件,由其他组件调用开始。Android 中的服务和 Windows 中的服务是类似的东西,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。
服务(Service)的实现
1. 定义类继承 Service,重写 onCreate()、 onStart(Intent intent, int startId)、 onBind(Intent intent)、 onUnbind(Intent intent)、onDestroy() 中需要的方法。
2. 在清单文件的 <application> 节点下声明 <service>。
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".MyService" > </service> </application>
服务不能自己运行,需要通过调 用 Context.startService() 或 Context.bindService() 方法启动服务。这两个方法都可以启动 Service,但是它们的使用场合有所不同。使用 startService() 方法启用服务,访问者与服务之间没有关联,即使访问者退出了,服务仍然运行。使用 bindService() 方法启用服务,访问者与服务绑定在了一起,访问者一旦退出,服务也就终止。采用 Context.startService() 方法启动服务,只能调用 Context.stopService() 方法结束服务,服务结束时会调用 onDestroy() 方法。【注意:服务的生命周期方法都是在主线程执行,所以不能直接在服务里面做耗时操作做,如果需要做耗时操作,应该在服务里面开启子线程。】
通过 startService() 和 stopService( ) 启动和关闭服务。适用于服务和访问者之间没有交互的情况。如果服务和访问者之间需要方法调用或者传递参数,则需要使用 bindService() 和 unbindService() 方法绑定和解绑服务。
采用 Context.bindService() 方法启动服务,在服务未被创建时,系统会先调用服务的 onCreate() 方法,接着调用 onBind() 方法,这个时候访问者和服务绑定在一起。 如果访问者要与服务进行通信,那么,onBind() 方法必须返回 Ibinder 对象。如果访问者退出了,系统就会先调用服务的 onUnbind() 方法,接着调用 onDestroy() 方法。如果调用 bindService() 方法前服务已经被绑定,多次调用 bindService() 方法并不会导致多次创建服务及绑定(也就是 说 onCreate() 和 onBind() 方法并不会被多次调用)。如果访问者希望与正在绑定的服务解除绑定,可以调用 unbindService() 方法,调用该方法也会导致系统调用服务的 onUnbind() → onDestroy() 方法。
服务(Service)的生命周期(服务的生命周期与启动服务的方法有关)
- 当采用 Context.startService() 方法启动服务,生命周期如下:
onCreate() → onStart() → onDestroy()
onCreate() 该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次 startService() 或 bindService() 方法,服务也只被创建一次。onStart() 只有采用 Context.startService() 方法启动服务时才会回调该方法,该方法在服务开始运行时被调用。多次调用 startService() 方法尽管不会多次创建服务,但 onStart() 方法会被多次调用。onDestroy() 该方法在服务被终止时调用。
- 当采用 Context.bindService() 方法绑定服务,生命周期如下:
onCreate() → onBind() → onUnbind() → onDestroy()
onBind() 只有采用 Context.bindService() 方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用 Context.bindService() 方法并不会导致该方法被多次调用。onUnbind() 只有采用 Context.bindService() 方法绑定服务后解绑服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。
- 如果先采用 startService() 方法启动服务,然后调用 bindService() 方法绑定到服务,再调用 unbindService() 方法解除绑定,最后调用 bindService() 方法再次绑定到服务,生命周期如下:
onCreate() → onStart() → onBind() → onUnbind()[重载后的方法需返回true] → onRebind()