Android之---Service介绍

来源:互联网 发布:什么牙刷好 知乎 编辑:程序博客网 时间:2024/06/06 18:27

Service—Android四大组件之一

简介

Service是Android的四大组件之一,它是用来进行后台操作的,它并不为用户提供界面,所有的操作都在后台完成,它的所有操作对用户都是不可见的。一旦其他的组件启动了一个Service,它会在后台一直运行,即便是用户切换到了其他的应用中。其他的组件也可以绑定Service进而启动一个Service,甚至可以用它来进行IPC(进程通信,inter process communication). Service可以进行的操作有很多,比如说网络通信,音乐播放,文件的I/O操作,以及和Content Provider进行交互。

Service生命周期图

 service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径:
这里写图片描述

Service的启动方式

  • A started service

      被开启的service通过其他组件调用 startService()被创建。

      这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。

      当service被停止时,系统会销毁它。

  • A bound service

      被绑定的service是当其他组件(一个客户)调用bindService()来创建的。

      客户可以通过一个IBinder接口和service进行通信。

      客户可以通过 unbindService()方法来关闭这种连接。

      一个service可以同时和多个客户绑定,当多个客户都解除绑定之后,系统会销毁service。

这两条路径并不是完全分开的。

即是说,你可以和一个已经调用了 startService()而被开启的service进行绑定。

比如,一个后台音乐service可能因调用 startService()方法而被开启了,稍后,可能用户想要控制播放器或者得到一些当前歌曲的信息,可以通过bindService()将一个activity和service绑定。这种情况下,stopService()或 stopSelf()实际上并不能停止这个service,除非所有的客户都解除绑定。

注意: Service是运行于寄主进程的主线程中,也就是说,一个Service启动的时候,它不会创建一个新的线程,也不会新开一个进程,除非你自己开一个进程。所以当你使用Service进行一些耗费CPU的操作时,最好新开一个线程,以减少ANR错误。

A bound service详解:

当绑定service和所有客户端解除绑定之后,Android系统将会销毁它,(除非它同时被onStartCommand()方法开启)。

因此,如果你的service是一个纯粹的绑定service,那么你不需要管理它的生命周期。

然而,如果你选择实现onStartCommand()回调方法,那么你必须显式地停止service,因为service此时被看做是开启的。

这种情况下,service会一直运行到它自己调用 stopSelf()或另一个组件调用stopService(),不论它是否和客户端绑定。

另外,如果你的service被开启并且接受绑定,那么当系统调用你的 onUnbind()方法时,如果你想要在下次客户端绑定的时候接受一个onRebind()的调用(而不是调用 onBind()),你可以选择在 onUnbind()中返回true。

onRebind()的返回值为void,但是客户端仍然在它的 onServiceConnected()回调方法中得到 IBinder 对象。

下图展示了这种service(被开启,还允许绑定)的生命周期:
这里写图片描述

Service实现类

实现一个MyService必须继承自Service类,如下:

package com.example.administrator.myservice;import android.app.Service;import android.content.Intent;import android.os.IBinder;public class MyService extends Service {    public MyService() {    }    @Override    public IBinder onBind(Intent intent) {        // TODO: Return the communication channel to the service.        throw new UnsupportedOperationException("Not yet implemented");    }    @Override    public void onCreate() {        super.onCreate();    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        return super.onStartCommand(intent, flags, startId);    }    @Override    public void onDestroy() {        super.onDestroy();    }}

Service生命周期回调方法

  • onBind()

      当其他的组件使用bindService()绑定Service的时候,这个方法会被调用。如果你实现了这个方法,你必须提供一个接口供客户端和这个Service通信,这时会返回一个IBinder对象。实际在编程的时候,你必须要实现这个方法,但是如果你不想要其他的组件绑定到这个Service上,你可以返回一一个空值。

  • onCreate()

      当Service第一次被创建时,这个方法会被调用,如果这个Service已经在运行了,就不会调用这个函数。

  • onStartCommand()

      当其他的组件,比如Activity,调用startService()方法启动Service的时候,就会调用这个方法。一旦这个方法执行了,service开始了,并且在后台运行。如果你实现了这个方法,当所有的工作完成之后,你应当调用stopSelf()方法或者是stopService()方法来结束这个Service。(如果你只是想绑定这个Service,那就不要实现这个方法)

  • onDestroy()

      当Service不再运行,并且被销毁,就会调用这个方法。在这个方法中应当清理Service所占用的所有系统资源,比如线程,注册的监听器,接收器等。这个方法是Services生命周期中最后被调用的方法。

参考资料

  API Guides:Services

  http://developer.android.com/guide/components/services.html

  API Guides:Bound Services

  http://developer.android.com/guide/components/bound-services.html

0 0
原创粉丝点击