首页 > 代码库 > Android Services (后台服务)
Android Services (后台服务)
一、简介
服务是可以在后台执行长时间运行的应用程序组件,它不提供用户界面。 另一个应用程序组件可以启动一个服务,并且即使用户切换到另一个应用程序,它仍然在后台运行。 另外,组件可以绑定到一个服务来与它进行交互,甚至执行进程间通信(IPC)。 例如,服务可以从后台处理网络交易,播放音乐,执行文件I / O或与内容提供商交互。
这些是三种不同类型的服务:
Scheduled(计划的服务)--- Android 5.0后可用
当在Android 5.0(API级别21)中引入的诸如JobScheduler之类的API启动服务时,将安排一项服务。您可以通过注册作业并指定其网络和时间要求来使用JobScheduler。然后系统在适当的时候优雅地安排作业执行。 JobScheduler提供许多方法来定义服务执行条件。
注意:如果您的应用定位到Android 5.0(API级别21),Google建议您使用JobScheduler执行后台服务。有关使用此类的更多信息,请参阅JobScheduler参考文档。
Started(开始的服务)
当应用程序组件(如活动)调用startService()时,服务将启动。启动后,服务可以在后台无限期运行,即使启动它的组件被销毁。通常,启动服务执行单个操作,并且不会将结果返回给调用者。例如,它可以通过网络下载或上传文件。操作完成后,服务应该停止。
Bound(绑定的服务)
当应用程序的组建调用bindService()时,此组件将绑定到服务。一个绑定的服务提供了 client-server 的接口,允许组件与服务之间进行交互,发送请求,接收结果,甚至可以通过进程间通信(IPC)进行交互。只要绑定了另一个应用程序组件,绑定的服务就会运行。多个组件可以同时绑定到服务,但是当所有组件都解除绑定时,服务将被销毁。
虽然本文通常单独讨论启动和绑定的服务,但您的服务可以以两种方式工作 - 它可以启动(无限期运行)并允许绑定。这只是你是否实现了一些回调方法:onStartCommand()允许组件启动它,并使用onBind()来允许绑定。
无论您的应用程序是启动,绑定还是两者都可以,任何应用程序组件都可以使用该服务(即使是单独的应用程序)也可以使用任何组件可以使用活动(通过以Intent启动它)。但是,您可以在清单文件中将服务声明为私有,并阻止其他应用程序的访问。具体的设置方法,在下面会说明。
注意:服务运行在主线程中,不会创建自己的线程,并且不会在单独的进程中运行,除非另有指定。如果您的服务将执行任何CPU密集型工作或阻塞操作(如MP3播放或网络),则应在服务中创建一个新的线程来完成此工作。通过使用单独的线程,您可以降低应用程序ANR错误的风险,并且应用程序的主线程可以保持专用于与您的活动的用户交互。
二、API概述
重要的回调方法:
|
当另一个组件请求启动该服务时,该系统通过调用startService()来调用此方法。当执行此方法时,服务将启动并可以无限期地在后台运行。 如果您实现了此功能,则您需要通过调用stopSelf()或stopService()来停止其工作完成。 如果您只想提供绑定,则不需要实现此方法。 |
|
当另一个组件想要与服务绑定(例如执行RPC)时,系统通过调用bindService()来调用此方法。 在实现此方法时,您必须提供一个客户端通过返回IBinder与服务进行通信的接口。 您必须始终执行此方法; 但是,如果您不想允许绑定,则应返回null。 |
onCreate() | 当服务最初创建时(在调用onStartCommand()或onBind())之前,系统调用此方法来执行一次性设置过程。 如果服务已经运行,则不会调用此方法。 |
onDestroy() | 当服务不再使用并被销毁时,系统调用此方法。 您的服务应该实现这一点,以清理任何资源,如线程,注册的听众或接收者。 这是服务接收的最后一个调用。 |
如果组件通过调用startService()(调用onStartCommand())来启动服务,则服务将继续运行,直到它停止自己的stopSelf()或另一个组件通过调用stopService()来停止它。
如果一个组件调用了bindService()来创建服务,并且onStartCommand()不被调用,那么只要组件被绑定就可以运行这个服务。服务从其所有客户端解除绑定后,系统会将其破坏。
Android系统会在内存不足的时候强制停止服务,并且必须为具有用户焦点的Activity恢复系统资源。如果服务被绑定到具有用户焦点的Activity,则不太可能被杀死;如果服务被声明在前台运行,很少会被杀死。如果服务启动并且长时间运行,系统将随着时间的推移在后台任务列表中降低其位置,并且服务变得非常容易被杀死 - 如果您的服务已启动,则必须设计它以优雅地处理重新启动系统。如果系统杀死您的服务,它将在资源可用时立即重新启动,但这也取决于从onStartCommand()返回的值。
Android Services (后台服务)