`

Android 开发之 Services 服务

阅读更多

 Service

  Service

  Class Overview 提要

  Service Lifecycle 服务生命周期

  Permissions 权限

  Process Lifecycle 进程生命周期

  Summary 总结

  Class Overview 提要

  服务(Service)是一个在后台运行的组件, 它一直保持运行, 并且不和用户进行交互. 每个服务类必须在它所在的包的AndroidManifest.xml中有一个声明. Service使用Context.startService() 和 ontext.bindService()启动.

  和其他应用程序对象一样, 服务在主线程中运行. 这意味着如果你的服务想做任何CPU密集型或者阻塞性的操作, 那么最好是创建一个线程来做.

  Service 类是应用程序的生命周期中的重要组成部分.

  Service Lifecycle 服务生命周期

  系统启动服务有两个原因. 如果有人调用Context.startService(), 那么启动会获取该服务(如果需要的话使用onCreate()来创建它)然后调用它的onStartCommand(Intent, int, int)方法, 传入客户提供的参数. 这时候服务会一直运行直到Context.stopService()或者stopSelf()被调用. 注意多个Context.startService()调用不会嵌套(虽然它们会导致多个onStartCommand()调用), 所以无论服务被启动了多少次, 一旦调用Context.stopService()或者stopSelf(), 则服务就会停止. 服务可以使用stopSelf(int)方法来保证启动的intent被处理后才会被停止.

  对于启动了的服务, 根据onStartCommand()返回值的不同, 有两种额外的操作模式.

  START_STICKY是显式启动和停止的服务使用的, 而START_NOT_STICKY 或者START_REDELIVER_INTENT是只在处理命令时才运行的服务使用的.

  START_NOT_STICKY 如果服务进程在它启动后(从onStartCommand()返回后)被kill掉, 并且没有新启动的intent传给他, 那么将服务移出启动状态并且不重新生成, 直到再次显式调用Context.startService().

  START_REDELIVER_INTENT 如果服务进程在它启动后(从onStartCommand()返回后)被kill掉, 那么它将会被重启, 并且最后传给它的intent会被重新传给它, 通过onStartCommand(Intent, int, int).

  START_STICKY 如果服务进程在它启动后(从onStartCommand()返回后)被kill掉, 那么让他呆在启动状态但不取传给它的intent.

  客户也可以使用Context.bindService()来取得和服务的永久性链接. 如果服务没有启动, 那么这将创建它(调用onCreate()),

但不会调用onStartCommand(). 客户将获取IBinder对象, 这些对象由服务的onBind(Intent)方法返回, 以便客户能够向服务发出调用. 只要链接建立, 服务就会一直运行(不管客户是否保留服务的IBinder的引用). 通常IBinder是使用aidl写成的一个复杂接口.

  一个服务同时可以被启动并连接. 在这样的情形下, 系统将让该服务保持运行,只要它是启动状态,或者有Context.BIND_AUTO_CREATE标志的连接. 当这两个条件都不满足时, 该服务的onDestroy()方法被调用, 服务被终止. 所有的清理工作(停止线程, 注销接收器)应该在onDestroy()中完成.

  Permissions 权限

  如果一个服务在manifest中的中声明一个服务的强制全局访问, 那么其它的应用程序必须在对应的元素中做相应的声明, 以便启动,停止或者绑定该服务.

  此外, 一个服务可以使用权限来保护一个IPC调用. 使用 checkCallingPermission(String) 方法.

  Process Lifecycle 进程生命周期

  android系统会试图保持持有服务的进程运行, 只要该服务被启动或者有客户连接它. 当内存不足时, 持有服务的进程将有较高的优先级:

  如果服务正在它的 onCreate(), onStartCommand()或者onDestroy()中运行, 那么持有服务的进程将变为前台进程.

  如果服务已经被启动了, 那么持有它的进程被认为比当前对用户可见的进程次要, 但比其它不可见的进程重要.

  如果有客户连接到服务, 那么该服务的进程的重要性不低于重要性最高的客户进程.

  一个已启动的服务可以诗意哦能够startForeground(int, Notification) API来将服务放在前台状态, 系统认为它是用户可见的, 因此在内存低的时候不会被kill.

  注意这意味着大部分服务在运行的时候, 它有可能被系统Kill掉. 这样, 系统之后会重启该服务. 如果你实现onStartCommand()来安排异步工作或者在另一个线程中工作, 那么你可能需要使用START_FLAG_REDELIVERY来让系统重新发送一个intent这样如果你的服务在处理它的时候被Kill掉, Intent不会丢失.

  Summary 总结

  公有方法

  final ApplicationgetApplication()

  返回持有该服务的应用程序.

  abstract IBinderonBind(Intent intent)

  返回该服务的通信通道.

  void onCreate()

  该服务第一次被创建时调用.

void onDestroy()

  当服务不再使用并即将被清除时调用.

  void onRebind(Intent intent)

  在onUbind()通知的断开连接的客户再次连接到服务时调用.

  int onStartCommand(Intent intent, int flags, int startId)

  每次一个客户显式启动该服务 (使用startService(Intent))时调用.

  boolean onUnbind(Intent intent)

  当所有客户都和服务的某个接口断开连接时调用.

  final void startForeground(int id, Notification notification)

  让服务运行在前台, 并给用户提示.

  final void stopForeground(boolean removeNotification)

  将服务从前台移除, 在需要内存时可以被Kill.

  final void stopSelf()

  如果它被启动了, 停止该服务.

  final boolean stopSelfResult(int startId)

  如果最近一次调用它的是startId, 那么停止服务.

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    android中Services使用

    在 Android 开发中,`Service` 是四大组件之一,用于执行后台任务,例如播放音乐、下载文件等。它可以在不显示任何用户界面的情况下运行,并且可以长时间运行而不会因系统资源限制而被终止。 #### 1.1 Service 类型...

    Android中webservices的应用demo

    在Android开发中,Web服务是一种常见的数据交互方式,它允许移动应用与远程服务器进行通信,获取或发送数据。本篇文章将深入探讨如何在Android中应用Web Services,特别是基于HTTP协议的SOAP(Simple Object Access ...

    android Push Services 源码和对应的.NET源码

    在Android和.NET开发中,Push Services是一个重要的概念,它涉及到应用程序如何接收远程消息或通知,尤其是在后台运行时。本文将详细解析"android Push Services 源码和对应的.NET源码",并探讨如何在Android客户端...

    使用 Android 开发基于 Web 服务的应用

    ### 使用 Android 开发基于 Web 服务的应用 #### 一、环境准备 为了更好地理解如何使用 Android 开发基于 Web 服务的应用程序,我们首先要确保具备适当的环境。这包括软件准备和安装配置。 ##### 1.1 软件准备 1...

    android 调用webservices 实例,可运行

    在Android开发中,调用Web服务是常见的需求,主要用于实现移动应用与远程服务器的数据交互。Web服务,如SOAP(简单对象访问协议)或RESTful API,可以提供数据接口供客户端应用进行请求和响应。本实例将详细介绍如何...

    10本android开发电子书籍

    6. **Google+Android开发入门指南(第一版)**:针对初学者,可能包含Android开发环境搭建、基本UI编程、网络通信、数据存储等基础知识,并结合Google的相关服务如Google Maps API、Google Play Services等。...

    Android开发之WebService介绍

    【Android开发之WebService介绍】 在Android开发中,与远程服务器进行数据交互是常见的需求,而WebService就是实现这种交互的一种方式。WebService是一种基于网络的、分布式的模块化组件,旨在促进不同系统之间的互...

    基于Android开发的天气预报app.zip

    总的来说,这个项目涵盖了Android开发的多个关键知识点,包括但不限于:Android Studio的使用、Android SDK、Activity和Fragment管理、布局设计、网络请求、数据解析、MVVM架构、用户位置服务和APK打包发布。...

    android开发google服务开发

    在Android开发中,Google服务是不可或缺的一部分,它们为开发者提供了丰富的功能,如地图集成、推送通知、云存储、用户身份验证等。本教程主要针对初学者,旨在帮助他们理解和掌握如何在Android应用中集成和使用...

    Android通过Webservices访问网络资源

    在Android开发中,访问网络资源是一项常见的任务,尤其当我们需要从服务器获取数据或者与服务器进行交互时。Webservices是一种常见的服务接口,如SOAP(Simple Object Access Protocol)或REST(Representational ...

    Android+REST WebService服务方式手机开发

    总的来说,Android+REST WebService服务方式手机开发涉及以下主要知识点: 1. RESTful架构原理及其核心概念。 2. Android中的HTTP客户端库,如HttpURLConnection、Apache HttpClient和OkHttp。 3. JSON数据格式及其...

    android游戏开发示例

    在Android游戏开发领域,开发者需要掌握一系列技术和工具来创建引人入胜的互动体验。"android游戏开发示例"这个项目可能是一个实例教程或者代码库,它提供了Android平台上游戏开发的具体实践。通过链接...

    基于Android studio无障碍开发demo源码.zip

    在Android平台上,无障碍服务(Accessibility Services)是一种强大的功能,它允许应用监听并交互与用户界面的元素,以帮助视力障碍或其他特殊需求的用户更轻松地使用设备。本项目"基于Android studio无障碍开发demo...

    ANDROID物联网开发从入门到实战源码_安卓源码_物联网_物联网开发_android_

    在Android物联网(IoT)开发领域,从入门到实战的过程涉及多个关键技术点和步骤。这份名为"ANDROID物联网开发从入门到实战源码"的资源,提供了丰富的实践案例,旨在帮助开发者掌握Android系统在物联网设备上的应用开发...

    Android开发实战代码(全套)

    在Android开发领域,实战经验是提升技能的关键。本资源提供了"Android开发实战代码(全套)",这是一套全面的源代码集合,旨在帮助开发者在实际项目中深化理解并提升技术能力。下面将针对Android开发的一些核心知识点...

    android访问webservices详细例子

    在Android开发中,访问Web Services是一项常见的任务,用于与服务器端进行数据交互。Web Services可以是基于SOAP(简单对象访问协议)或者RESTful(表述性状态转移)的API,它们提供了一种跨平台、跨语言的数据交换...

    google android 开发入门与实战 源码

    在Android开发领域,Google Android平台提供了丰富的工具和资源,使得开发者可以构建出各种各样的应用程序。这份"google android 开发入门与实战 源码"是针对初学者和进阶者设计的,通过源码分析,能帮助你深入理解...

    VoLTE SIP代码意义及流程图解_VoLTESIP开发流程_android_

    3. **Android平台上的VoLTE**: Android系统支持VoLTE功能,通过RCS(Rich Communication Services)API和IMS框架实现。开发者可以使用这些接口来集成VoLTE功能。 二、VoLTE SIP开发流程 1. **注册过程**: 用户首次...

    Android 开发过程网络相关问题

    在Android开发过程中,网络相关的议题是开发者经常遇到的挑战之一。这篇博客文章“Android开发过程网络相关问题”可能深入探讨了Android应用如何与服务器进行通信,处理数据交换以及解决可能出现的异常情况。以下是...

Global site tag (gtag.js) - Google Analytics