0X00 Service 基础知识

Service 作为 Android 提供的四大组件之一,主要负责一些没有前台显示的后台任务。即使应用本身不再可见,Service 的属性也能使得其在后台运行。除此之外,Service 也可以通过 Binder 机制,与界面甚至其他应用进行进程间通信,以实现相应的交互。这里需要简单说明的是,既然是后台任务,为什么不选用 Thread 了?选用 Service 和 Thread 的主要区别在于需不需要在应用不可见的时候依然保留。举例来说,新闻详情页面的数据请求,只用在当前页面生效,而音乐播放这些后台任务就可以通过 Service 的方式来实现。

关于如何使用 Service,官方教程已经说明得足够详细了,如果对这些用法,还有不清晰的地方,请戳这里进行查看,-> 官方教程。官方教程里面包括,startService 和 bindService 的区别,在不同场景下应该选用哪种 Service 实现方式。


0X01 startService 调用流程

从前面的教程里面,可以知道 Service 的启动一般有两种方式,分别是 bindService 和 startService。这里主要说明 startService, 具体的实现逻辑在 ContextImpl 中,我们看看源码是怎么实现的。

@Override
public ComponentName startService(Intent service) {warnIfCallingFromSystemProcess();return startServiceCommon(service, mUser);
}

接下来,看看方法内部具体是怎么实现的。

private ComponentName startServiceCommon(Intent service, UserHandle user) {try {validateServiceIntent(service);service.prepareToLeaveProcess();ComponentName cn = ActivityManagerNative.getDefault().startService(mMainThread.getApplicationThread(), service, service.resolveTypeIfNeeded(getContentResolver()), getOpPackageName(), user.getIdentifier());// ignore some codes...return cn;} catch (RemoteException e) {throw new RuntimeException("Failure from system", e);}
}

从上面的代码可以看到,这里是通过 ActivityManagerNative 来执行的。如果看过我的另一篇文章,Android Activity 生命周期是如何实现的, 可能会觉得很熟悉。事实上这里采用的机制就是同样的。

private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {protected IActivityManager create() {IBinder b = ServiceManager.getService("activity");if (false) {Log.v("ActivityManager", "default service binder = " + b);}IActivityManager am = asInterface(b);if (false) {Log.v("ActivityManager", "default service = " + am);}return am;}
};

ActivityManagerNative 的 getDefault 方法是这么实现的。可以看到,gDefault 是类型为 IActivityManager 的 Binder 对象。而这个 Binder 对象可以看做是在 System Server 中的 ActivityManagerService 的句柄,通过这个 Binder 对象,可以跨进程调用 ActivityManagerService。

如果上述内容不容易理解的话,我们可以类比地来看这个问题。我们遥控电视的时候,例如进行增加音量的操作,这个操作实际不是由遥控器完成的,而是电视中的电子元件完成的。遥控器会和电视进行协商,先声明有哪些操作可以执行,然后将这些协商后的操作在遥控器端和电视端

从源码出发深入理解 Android Service相关推荐

  1. android 浏览器源码分析,从源码出发深入理解 Android Service

    原标题:从源码出发深入理解 Android Service 原文链接: 建议在浏览器上打开,删除了大量代码细节,:) 本文是 Android 系统学习系列文章中的第三章节的内容,介绍了 Android ...

  2. android toolbar源码解析,深入理解Android 5.0中的Toolbar

    环境说明: Android Studio 2.0 V7包版本:com.android.support:appcompat-v7:23.4.0 compileSdkVersion 23 buildToo ...

  3. 【Android 10 源码】深入理解 Omx 初始化

    MediaCodec 系列文章: [Android 10 源码]深入理解 MediaCodec 硬解码初始化 [Android 10 源码]深入理解 Omx 初始化 [Android 10 源码]深入 ...

  4. 【Android 10 源码】深入理解 software Codec2 服务启动

    MediaCodec 系列文章: [Android 10 源码]深入理解 MediaCodec 硬解码初始化 [Android 10 源码]深入理解 Omx 初始化 [Android 10 源码]深入 ...

  5. 【Android 10 源码】深入理解 MediaCodec 组件分配

    MediaCodec 系列文章: [Android 10 源码]深入理解 MediaCodec 硬解码初始化 [Android 10 源码]深入理解 Omx 初始化 [Android 10 源码]深入 ...

  6. 源码茶舍之android:externalService是什么属性?实现原理?

    发现 在AndroidManifest中声明Service时,偶然发现一个布尔类型的属性:android:externalService 示例如下: <serviceandroid:extern ...

  7. 从源码角度深入理解Toast

    Toast这个东西我们在开发中经常用到,使用也很简单,一行代码就能搞定: 1: Toast.makeText(this, "333", Toast.LENGTH_LONG).sho ...

  8. android 4 源码目录,LXR 目录Android 源码

    LXR 索引Android 源码 最近在学习android 源码,为了便于查看和搜索代码,利用LXR 建立了android 源码索引环境,非常方便. LXR 本身是建立对linux 源码进行索引的,本 ...

  9. 直播平台源码搭建教程之Android音视频开发

    直播平台源码搭建教程之Android音视频开发 音频 将声音保存成音频的过程,其实就是将模拟音频数字化的过程,为了实现这个过程,就需要对模拟音频进行采样.量化和编码.接下来我们详细讲解这一过程. 采样 ...

最新文章

  1. Docker使用笔记
  2. 【keras】rnn中的LSTM
  3. Django之重定向
  4. ESX 3.5 与License Server不定时失去连接解决方法一例
  5. 成功解决AttributeError: 'list' object has no attribute 'shape'
  6. 分布式存储的集群可靠性计算(ceph)
  7. java文件客户端下载_使用Java写一个minio的客户端上传下载文件
  8. 信息学奥赛C++语言:求平均分
  9. day4-mysql数据关系
  10. oracle如何查不满16岁,如何在Oracle数据库中使用SQL查询获取基于年龄组的人数?...
  11. OSGEarth基于经纬度获取高程数据
  12. 彩灯控制器课程设计vhdl_EDA课程设计彩灯控制器
  13. 随机效应与混合效应模型 SAS实践
  14. js 仿微信投诉—引入vue.js,拆分组件为单个js
  15. 【日语】五十音图-一个好用的日语五十音图记忆方法
  16. [UE4]Steam联机设置
  17. 轨道运营管理专业自荐书_城市轨道交通运营管理专业职业规划(1)
  18. 西安交通大学计算机考研资料汇总
  19. BCG 动态链接库和静态链接库
  20. 基于Spark的电影推荐系统(推荐系统~4)

热门文章

  1. 解决Mysql无法导入存在null数据的问题
  2. 计算机重复启动问题原因及修复
  3. 类的初始化(构造函数)
  4. 在java 里kv 是什么_consul kv使用介绍
  5. 【Python】集合的交、并、补、差集怎么算?
  6. 【记录】一段不知结果如何的“互联网+”比赛心路历程
  7. USTC English Club Note20211223
  8. 科大星云诗社动态20210820
  9. 最新 | Python 官方中文文档正式发布!
  10. xp,win7,win2003,win2008常用命令集