Android开发基础之Service

androidDevelopers

Android四大基本组件分别是Activity,Service,Content Provider,BroadcastReceiver。这篇文章将主要介绍Service组件,其中包括Service是什么,,Service的创建,Service的生命周期等等。

前面的文章曾经介绍到Android中Activity是一个app的门面,Activity组件提供永和界面,处理用户交互。今天说到的Service可不是这样,在开发app的时候可能会遇到这样一个情况,当你的app没有显示在屏幕上时候(这时Activity可能会被销毁来腾出内存空间)而你想去给用户推送一个通知或者想在后台处理一些事物,这样的话用Activity显然就不行了,这时候就要引入Service了。

 

1.什么是Service

Service(服务)是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。另外,一个组件能够绑定到一个service与之交互,例如,一个service可能会处理网络操作,播放音乐,操作文件I/O或者与内容提供者(content provider)交互,所有这些活动都是在后台进行。比如系统的音乐播放器就是使用了Service来播放音乐,这样用户最小化播放器的时候音乐不会因为Activity被回收而被停止。

 

Sercvice和其他应用组件一样,它也是运行在当前app的宿主进程的的主线程的,这就表明,如果创建的Service想要一直占用CPU (比如MP3播放)或者进行一些可能造成阻塞(网络通讯)的操作,同样需要创建那个操作的一个子线程来完成那样的耗时操作,否则主线程也是会被阻塞的。

其实Service也并不是很难,它主要由以下两个功能

1.1 Service用来告诉操作系统它需要在后台进行一些操作(即使用户并不与app进行交互)。如果要进行这种操作,可以使用 Context.startService()  ,这个方法会让系统来为Service安排运行时间,Service会一直运行直到Service的工作完成或者被用户停止,也就是说即使你的app退出了,这个Service依然有效。

1.2 Service也被用来暴露自己app的某些功能给其他的app,这时可以使用 Context.bindService() 来将服务进行绑定,当一个Activity绑定到一个Service上时,它负责维护Service实例的引用,允许你对正在运行的Service进行一些方法调用。

 

2.如何创建Service

要建立一个service,必须先创立一个Service的子类,然后通过重写Service父类的回调方法来控制Service,通常以几个方法需要被重写。

2.1 onStartCommand()

当掐Activity或者组件需要service启动的时候,系统将会调用 startService() 这个方法。一旦这个方法执行了,这个service将会被启动并且一直在后台运行, 开发者有责任去停止service当service的任务完成之后,通过调用 stopService() 或者 stopSelf()  方法就可以停止service。

2.2 onBind()

当有组件杨绑定service的时候(比如service播放音乐时候用户需要暂停),可以调用 bindService()方法。这时,你必须提供一个接口让客户端来与当前service交互。

2.3 onCreate()

这个和Activity一样,当service第一次创建的时候系统将会运行这个方法,这个方法比前两个方法调用的时间都要早,但是如果服务已经启动了,这个方法将不会被调用。

2.4 onDestory()

当service不在被使用或者将要被销毁的时候系统将会调用这个方法,创建的service应该使用这个方法来释放资源,比如停止线程,取消监听器的注册等等。

与Activity一样,创建的Service也要在AndroidManifest.xml文件中进行注册。下面的代码就是注册一个Service的代码:

<manifest ... >
  ...
  <application ... >
      <service android:name=".ExampleService" />
      ...
  </application>
</manifest>

2.Service的生命周期

service_lifecycle

这还有一张比较简易的解释图

service

和Activity一样,service也有着生命周期的回调节方法,开发者可以重写这些方法来监控service的状态然后做出相应的处理,以下的代码就反映了Service生命周期的回调方法:

public class ExampleService extends Service {
 int mStartMode; // indicates how to behave if the service is killed
 IBinder mBinder; // interface for clients that bind
 boolean mAllowRebind; // indicates whether onRebind should be used

 @Override
 public void onCreate() {
 // The service is being created
 }
 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {
 // The service is starting, due to a call to startService()
 return mStartMode;
 }
 @Override
 public IBinder onBind(Intent intent) {
 // A client is binding to the service with bindService()
 return mBinder;
 }
 @Override
 public boolean onUnbind(Intent intent) {
 // All clients have unbound with unbindService()
 return mAllowRebind;
 }
 @Override
 public void onRebind(Intent intent) {
 // A client is binding to the service with bindService(),
 // after onUnbind() has already been called
 }
 @Override
 public void onDestroy() {
 // The service is no longer used and is being destroyed
 }
}

整个service的生命周期是在  onCreate() 被调用的时候和onDestory()返回时候的中间。与Activity一样,service应该在onCreate()时候进行预处理,然后在onDestory()进行资源回收 。举个例子,一个播放音乐的service可以在onCreate()阶段来创建播放音乐的线程,然后在onDestory()阶段来停止线程,不管service是根据哪种方法被创建了,这两个方法都会被调用。

此文章作者为周毅刚,归属于其个人网站miketech.it,未经允许,不得转载。

打赏

Leave a Reply

Your email address will not be published. Required fields are marked *