目录
12.Service应用(一)
1.Service概述
Service (服务)是能够在后台长时间运行,并且不提供用户界面的应用程序组件。其他应用程序组件能启动Service,并且即便用户切换到另一个应用程序,Service 还可以在后台运行。此外,组件能够绑定到Service并与之交互,甚至执行进程间通信(IPC)。例如,Service 能在后台处理网络事务、播放音乐、执行文件操作或者与Content Provider通信。
1-1.Service 的分类
Service按照启动方式可以分为以下两种类型。
◆Started Service:当应用程序组件(如Activity)通过调用startService() 方法启动Service时,Service处于启动状态。一旦启动, Service 能在后台无限期运行。
◆Bound Service:当应用程序组件通过调用bindService()方法绑定到Service时,Service处于绑定状态。多个组件可以同时绑定到一个Service 上,当它们都解除绑定时,Service 被销毁。
Started Service与Bound Service的区别如表12.1所示。
表12.1 Started Service与Bound Service的区别
Started Service | Bound Service |
---|---|
使用startService()方法启动 | 调用bindService()方法绑定 |
通常只启动,不返回值 | 发送请求,得到返回值 |
启动Service的组件与Service之间没有关联,即使关闭该组件,Service也会一直运行 | 启动Service的组件与Service绑定在一起, 如果关闭该组件,Service就会停止运行。 |
回调onStartCommand()方法,允许组件启动Service | 目调onBind()方法,允许组件绑定Service |
注:Service可以同时属于这两种类型,既可以启动(无限期运行)又能绑定。不管应用程序是否为启动状态、绑定状态或者两者兼有,都能通过Intent对象使用Service,就像使用Activity那样。然而,开发人员可以在配置文件中将Service声明为私有的,从而阻止其他应用程序访问。
1-2.Service的生命周期
Service的生命周期比Activity简单很多,但是却需要开发人员更加关注Service如何创建和销毁,因为Service可能在用户不知情的情况下在后台运行。
Service的生命周期可以分成两个不同的路径:
◆通过startService()方法启动Service
当其他组件调用startService()方法时,Service 被创建,并且无限期运行,其自身必须调用stopSelf()方法或者其他组件调用stopService()方法来停止Service。当Service停止时,系统将其销毁。
◆通过bindService()方法启动Service
当其他组件调用bindService()方法时,Service 被创建,接着客户端通过IBinder接口与Service通信,客户端通过unbindService()方法关闭连接。多个客户端能绑定到同一个Service,并且当它们都解绑定时,系统销毁Service (Service 不需要被停止)。
这两条路径并非完全独立,即开发人员可以绑定已经使用startService()方法启动的Service。例如,后台音乐Service能使用包含音乐信息的Intent 通过调用startService()方法启动。当用户需要控制播放器或者获得当前音乐信息时,可以调用bindService()方法绑定Activity到Service。此时,只有stopService()和stopSelf()方法全部被客户端解绑定时才能停止Service。
为了创建Service,开发人员需要创建Service类或其子类的子类。在实现类中,需要重写一些处理Service生命周期重要方面的回调方法,并根据需要提供组件绑定到Service的机制。需要重写的重要回调方法如表12.2所示。
方法名 | 描述 |
---|