Android Service是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件,它分为两种工作状态,一种是启动状态,主要用于执行后台计算;另一种是绑定状态,主要用于其他组件和Service的交互。需要注意的两点:

  • 两种状态是共存的,即Service可以是启动状态也可以同时是绑定状态
  • 防止ANR风险,主线程运行的Service在执行耗时操作,则应在服务内创建新线程来完成这项工作,这可以降低发生“应用无响应”(ANR) 错误的风险。

使用

要创建服务,您必须创建 Service 的子类。在实现中,需要重写一些回调方法,以处理服务生命周期的某些关键方面并提供一种机制将组件绑定到服务。

public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
}

Service需要重写重要的回调方法有以下几个

  • onStartCommand():通过调用 startService() 请求启动服务时,系统将调用此方法,bindService无需实现该方法
  • onBind():通过调用 bindService() 与服务绑定(例如执行 RPC)时,系统将调用此方法,通过返回 IBinder 提供一个接口,供客户端用来与服务进行通信
  • onCreate():首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前)
  • onDestroy():当服务不再使用且将被销毁时,系统将调用此方法。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等。 这是服务接收的最后一个调用

像Activity(以及其他组件)一样,您必须在应用AndroidManifest.xml清单文件中声明所有服务

<service android:name=".MyService"/>

通过Context启动一个Service,这会导致对 onStartCommand() 的调用,则服务将一直运行,直到服务使用 stopSelf() 自行停止运行,或由其他组件通过调用 stopService() 停止,如下所示

startService(new Intent(this, MyService.class));

但在Android8.0的应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException。 新的 Context.startForegroundService() 函数将启动一个前台服务。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    startForegroundService(intent);
} else {
    startService(intent);
}

并且在在service里再调用startForeground方法,不然就会出现ANR

context.startForeground(SERVICE_ID, builder.getNotification());

通过Context绑定一个Service,且未调用 onStartCommand(),则服务只会在该组件与其绑定时运行,一旦该服务与所有客户端之间的绑定全部取消,系统便会销毁它,如下所示

bindService(new Intent(this, MyService.class), connection, BIND_AUTO_CREATE);

注意:系统内存不足时,Android会强制停止优先级低的Service来提供内存给Activity使用,但持有Activity的Service可能不会终止,或者前台运行的Service几乎永远不会终止。

Service启动

首先我们先看下Service的类的调用流程



相关类说明

  • ContextWrapper:代理Context的实现,简单地将其所有调用委托给另一个Context
  • ContextImpl:Context API的通用实现,为Activity和其他应用程序组件提供基本上下文对象
  • ActivityManager:此类提供有关活动,服务和包含过程的信息和交互
  • IActivityManager.aidl:用于与ActivityManagerService交谈的系统专用API,提供了从应用程序返回到活动管理器的调用
  • ActivityManagerService:负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作
  • ActivityThread:管理应用程序进程中主线程的执行,根据ActivityManager请求调度和执行Activitys、broadcasts和其他操作
  • ApplicationThread:ActivityThread内部类,IApplicationThread.aidl的具体实现,提供给ActivityManager,ActivityManager通过它告知应用程序将要做的事
  • IApplicationThread:用于与应用程序通信的系统专用API

Service最终创建需要需要通过Handler进行消息发送来实现创建,并把创建好的servic存储在ArrayMap中。接下来看下Service的生命周期是怎样的。



需要注意的是,在整个生命周期内,只有startCommand()能被多次调用。其他方法只能被调用一次。

Service绑定

Service绑定跟Service的启动了类调用流程基本一致,只是相关方法改为bind,但其最后会调用ServiceConnection对象的onServiceConnected方法。接下来看下Service的生命周期是怎样的



但其有一个特性,多次绑定同一个Service时,Service的onBind方法只会执行一次,除非Service被终止了。

Android Service解析的更多相关文章

  1. Android Service完全解析,关于服务你所需知道的一切(下)

    转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...

  2. Android Service完全解析,关于服务你所需知道的一切(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...

  3. 【转】Android Service完全解析,关于服务你所需知道的一切(下) ---- 不错

    原文网址:http://blog.csdn.net/guolin_blog/article/details/9797169 转载请注册出处:http://blog.csdn.net/guolin_bl ...

  4. [转]Android Service完全解析,关于服务你所需知道的一切

      目录(?)[+] Android Service完全解析,关于服务你所需知道的一切(上) 分类: Android疑难解析2013-10-31 08:10 6451人阅读 评论(39) 收藏 举报 ...

  5. (转) Android Service完全解析,关于服务你所需知道的一切(上)

    相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序 ...

  6. Android Service完全解析,关于服务你所需知道的一切(下) (转载)

    转自:http://blog.csdn.net/guolin_blog/article/details/9797169 转载请注册出处:http://blog.csdn.net/guolin_blog ...

  7. Android Service完全解析,关于服务你所需知道的一切(上) (转载)

    转自:http://blog.csdn.net/guolin_blog/article/details/11952435 转载请注明出处:http://blog.csdn.net/guolin_blo ...

  8. Android Service完全解析(上)

    转载:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Androi ...

  9. Android Service完全解析,关于服务你所需知道的一切(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...

随机推荐

  1. 【洛谷4172】 [WC2006]水管局长(LCT)

    传送门 洛谷 BZOJ Solution 如果不需要动态的话,那就是一个裸的最小生成树上的最大边权对吧. 现在动态了的话,把这个过程反着来,就是加边对吧. 现在问题变成了怎么动态维护加边的最小生成树, ...

  2. MySQL Schema与数据类型的优化

    选择优化的数据类型: 1. 更小的通常更好: 一般情况下,应该尽量使用可以正确存储数据的最小数据类型.更小的数据类型通常更快,因为他们占用更少的磁盘,内存和cpu缓存,并且处理时需要的cpu周期也更少 ...

  3. Javascript高级编程学习笔记(31)—— BOM(5)screen、history对象

    screen对象 screen对象应该是BOM对象中最不常用的对象了 其主要用于提供客户端的显示能力信息 包括浏览器外部显示的信息,和像素的宽高等 这个对象的主要用于检测客户端能力,一般不会影响功能 ...

  4. Javascript高级编程学习笔记(30)—— BOM(4)navigator对象

    window对象作为浏览器的全局对象.location对象保存了页面的url信息 那么navigator对象又有什么作用呢? navigator对象 该对象最早由 Netspace Navigator ...

  5. Java 使用 Map 实现缓存工具

    以下代码参考于网上,做了小部分修改. 该代码实现了定时清除临时缓存的功能. 缓存管理类 package com.wbproject.util.cache; import java.time.Local ...

  6. 第59节:Java中的html和css语言

    欢迎到我的简书查看我的文集 前言: HTML 英文: HyperText Markup Language内容 html是超文本标记语言,是网页语言的基础知识,html是通过标签来定义的语言,所有代码都 ...

  7. 第58节:Java中的图形界面编程-GUI

    欢迎到我的简书查看我的文集 前言: GUI是图形用户界面,在Java中,图形用户界面我们用GUI表示,而GUI的完整英文为: Graphical User Interface(图形用户接口), 所谓图 ...

  8. linux mint 安装 opencv2.4

    Download opencv https://github.com/opencv/opencv/tree/2.4 安装必要的依赖 sudo apt-get install build-essenti ...

  9. 微信小程序开发-第一弹

    前言:       本篇文章为大家详细介绍微信小程序开发第一篇,后续步骤会逐步更新,欢迎大家关注. 第一步  注册        1.1 打开网址 https://mp.weixin.qq.com/  ...

  10. (转)Python__slots__详解

    原文:https://www.cnblogs.com/rainfd/p/slots.html#top 摘要 当一个类需要创建大量实例时,可以通过__slots__声明实例所需要的属性, 例如,clas ...