从源码出发深入理解 Android Service
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相关推荐
- android 浏览器源码分析,从源码出发深入理解 Android Service
原标题:从源码出发深入理解 Android Service 原文链接: 建议在浏览器上打开,删除了大量代码细节,:) 本文是 Android 系统学习系列文章中的第三章节的内容,介绍了 Android ...
- android toolbar源码解析,深入理解Android 5.0中的Toolbar
环境说明: Android Studio 2.0 V7包版本:com.android.support:appcompat-v7:23.4.0 compileSdkVersion 23 buildToo ...
- 【Android 10 源码】深入理解 Omx 初始化
MediaCodec 系列文章: [Android 10 源码]深入理解 MediaCodec 硬解码初始化 [Android 10 源码]深入理解 Omx 初始化 [Android 10 源码]深入 ...
- 【Android 10 源码】深入理解 software Codec2 服务启动
MediaCodec 系列文章: [Android 10 源码]深入理解 MediaCodec 硬解码初始化 [Android 10 源码]深入理解 Omx 初始化 [Android 10 源码]深入 ...
- 【Android 10 源码】深入理解 MediaCodec 组件分配
MediaCodec 系列文章: [Android 10 源码]深入理解 MediaCodec 硬解码初始化 [Android 10 源码]深入理解 Omx 初始化 [Android 10 源码]深入 ...
- 源码茶舍之android:externalService是什么属性?实现原理?
发现 在AndroidManifest中声明Service时,偶然发现一个布尔类型的属性:android:externalService 示例如下: <serviceandroid:extern ...
- 从源码角度深入理解Toast
Toast这个东西我们在开发中经常用到,使用也很简单,一行代码就能搞定: 1: Toast.makeText(this, "333", Toast.LENGTH_LONG).sho ...
- android 4 源码目录,LXR 目录Android 源码
LXR 索引Android 源码 最近在学习android 源码,为了便于查看和搜索代码,利用LXR 建立了android 源码索引环境,非常方便. LXR 本身是建立对linux 源码进行索引的,本 ...
- 直播平台源码搭建教程之Android音视频开发
直播平台源码搭建教程之Android音视频开发 音频 将声音保存成音频的过程,其实就是将模拟音频数字化的过程,为了实现这个过程,就需要对模拟音频进行采样.量化和编码.接下来我们详细讲解这一过程. 采样 ...
最新文章
- Docker使用笔记
- 【keras】rnn中的LSTM
- Django之重定向
- ESX 3.5 与License Server不定时失去连接解决方法一例
- 成功解决AttributeError: 'list' object has no attribute 'shape'
- 分布式存储的集群可靠性计算(ceph)
- java文件客户端下载_使用Java写一个minio的客户端上传下载文件
- 信息学奥赛C++语言:求平均分
- day4-mysql数据关系
- oracle如何查不满16岁,如何在Oracle数据库中使用SQL查询获取基于年龄组的人数?...
- OSGEarth基于经纬度获取高程数据
- 彩灯控制器课程设计vhdl_EDA课程设计彩灯控制器
- 随机效应与混合效应模型 SAS实践
- js 仿微信投诉—引入vue.js,拆分组件为单个js
- 【日语】五十音图-一个好用的日语五十音图记忆方法
- [UE4]Steam联机设置
- 轨道运营管理专业自荐书_城市轨道交通运营管理专业职业规划(1)
- 西安交通大学计算机考研资料汇总
- BCG 动态链接库和静态链接库
- 基于Spark的电影推荐系统(推荐系统~4)