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概述

重要的回调方法:


onStartCommand()

当另一个组件请求启动该服务时,该系统通过调用startService()来调用此方法。当执行此方法时,服务将启动并可以无限期地在后台运行。 如果您实现了此功能,则您需要通过调用stopSelf()或stopService()来停止其工作完成。 如果您只想提供绑定,则不需要实现此方法。

onBind()

当另一个组件想要与服务绑定(例如执行RPC)时,系统通过调用bindService()来调用此方法。 在实现此方法时,您必须提供一个客户端通过返回IBinder与服务进行通信的接口。 您必须始终执行此方法; 但是,如果您不想允许绑定,则应返回null。
onCreate() 当服务最初创建时(在调用onStartCommand()或onBind())之前,系统调用此方法来执行一次性设置过程。 如果服务已经运行,则不会调用此方法。
onDestroy() 当服务不再使用并被销毁时,系统调用此方法。 您的服务应该实现这一点,以清理任何资源,如线程,注册的听众或接收者。 这是服务接收的最后一个调用。

如果组件通过调用startService()(调用onStartCommand())来启动服务,则服务将继续运行,直到它停止自己的stopSelf()或另一个组件通过调用stopService()来停止它。

如果一个组件调用了bindService()来创建服务,并且onStartCommand()不被调用,那么只要组件被绑定就可以运行这个服务。服务从其所有客户端解除绑定后,系统会将其破坏。

Android系统会在内存不足的时候强制停止服务,并且必须为具有用户焦点的Activity恢复系统资源。如果服务被绑定到具有用户焦点的Activity,则不太可能被杀死;如果服务被声明在前台运行,很少会被杀死。如果服务启动并且长时间运行,系统将随着时间的推移在后台任务列表中降低其位置,并且服务变得非常容易被杀死 - 如果您的服务已启动,则必须设计它以优雅地处理重新启动系统。如果系统杀死您的服务,它将在资源可用时立即重新启动,但这也取决于从onStartCommand()返回的值。

时间: 2024-08-06 11:55:21

Android Services (后台服务)的相关文章

android 实现后台服务及源码下载

android APP后台服务可以长期与服务器进行长期的交互,保证数据的实时性,这个小项目主要实现的是在app退出之后依然可以运行服务.使用系统的Intent.ACTION_TIME_TICK进行实现,这个系统的广播每隔一分钟就进行广播一次,可以在程序中接收该广播消息,接收到之后检测app中的service服务是否在运行,如果在运行,则不处理,如果没有运行,则重新启动该service服务. 值得注意的是,虽然本示例可以实现后台运行服务的功能,但是当用户按home键进行清楚内存的时候依然可以把ap

Android Service 后台服务之本地服务

Service是Android系统的服务组件,适用于开发没有用户界面且长时间在后台运行的功能 - Service简介 因为手机硬件性能和屏幕尺寸的限制,通常Android系统仅允许一个应用程序处于激活状态并显示在手机屏幕上,而暂停其他处于未激活状态的程序. 因此,Android系统需要一种后台服务机制,允许在没有用户界面的情况下,使程序能够长时间在后台运行,实现应用程序的后台服务功能. 在实际应用中,有很多应用需要使用Service,比如MP3播放器要求在关闭播放器界面后,仍然能够后台保持音乐持

android如何做到类似于微信那样后台服务不会被杀死?

问题描述 正在做一款锁屏应用. 做锁屏肯定用到了service,可是我发现每日手动点击自带的内存清理按钮的时候,我的那个service总是会被杀死. 而微信的后台服务却是一直正常的运行,不会被杀掉. 360的话也不会被杀死,但是360会重新启动.而且360的是两个后台服务,我猜有可能会相互作用的,杀死一个的时候另一个接收到广播把其重启. 尝试过用startForeground以及提高service优先级的方式,发现都不行,service都会被杀死. 反编译了一下微信的代码. 请大家帮忙想想办法吧

Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务

Service后台服务.前台服务.IntentService.跨进程服务.无障碍服务.系统服务 本篇文章包括以下内容: 前言 Service的简介 后台服务 不可交互的后台服务 可交互的后台服务 混合性交互的后台服务 前台服务 IntentService AIDL跨进程服务 AccessibilityService无障碍服务 系统服务 部分源码下载 前言 作为四大组件之一的Service类,是面试和笔试的必备关卡,我把我所学到的东西总结了一遍,相信你看了之后你会对Service娓娓道来,在以后遇

Android官方开发文档Training系列课程中文版:后台服务之IntentService的创建

原文地址:http://android.xsoftlab.net/training/run-background-service/index.html 引言 除非特别指定,否则所有的操作都是在UI线程中执行的.不过这会引起问题,因为长时间的耗时操作会妨碍UI线程的运行.这会惹恼用户,并可能会引起系统错误.为了避免这样的情况出现,Android为此提供了一些类,可以使这些耗时操作放在单独的线程中执行.这里用到最多的就是IntentService了. 这节课主要学习如何实现IntentService

Android 三级联动选择城市+后台服务加载数据库

技术渣,大家将就着看 首先我们需要一个xml数据保存到数据库,这里我从QQ下面找到一个loclist.xml文件 <CountryRegion Name="中国" Code="1"> <State Name="北京" Code="11"> <City Name="东城" Code="1" /> <City Name="西城"

Android中如何像 360 一样优雅的杀死后台服务而不启动

Android中,虽然有很多方法(API或者shell命令)杀死后台`service`,但是仍然有很多程序几秒内再次启动,导致无法真正的杀死.这里主要着重介绍如何像 360 一样杀死Android后台服务,而不会再次启动. 一.已知的 kill 后台应用程序的方法 android.os.Process.killProcess(pid); activityManager.killBackgroundProcesses(pkgName); kill -9 pid 这三种方法都可以“杀死”后台应用程序

Android窗口管理服务WindowManagerService计算窗口Z轴位置的过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8570428 通过前面几篇文章的学习,我们知道了在 Android系统中,无论是普通的Activity窗口,还是特殊的输入法窗口和壁纸窗口,它们都是被WindowManagerService服务组 织在一个窗口堆栈中的,其中,Z轴位置较大的窗口排列在Z轴位置较小的窗口的上面.有了这个窗口堆栈之后,WindowManagerService服务 就可

Android -Services 使用简介

Android Services 四大组件之一,主要用于后台长时间运行.没有界面.这里讲解两种services的启动还有AIDL通信方式. 1.startservices a.建立继承services的类,复写方法(本地服务) public class MyServices extends Service { private static final String TAG="TestTag"; @Override public IBinder onBind(Intent arg0) {