Android系统机制
Android系统机制
本文主要介绍Android系统整体运行机制
Linux中的一些概念
uboot加载系统内核到内存,系统内核运行起来的后,会创建第一个用户进程叫init进程,该进程是所有用户进程的始祖进程。该进程的作用就是要么派生新的用户进程,要么回收那些孤儿进程
Android中的进程
Android系统构建在linux系统之上,所以Android系统中的进程全是用户进程。但是Android对于进程的管理并没有完全依赖于linux,它里面也有一个始祖进程zygote进程,Android中所有进程都是由该进程派生出来的。当然,该进程是由init进程派生出来的。
三大进程
zygote:Android所有进程的始祖,Android中所有的进程都是由它创建(fork)的,这点很重要
SystemServer:android中的系统级服务进程,我们把它可以看作一个服务器,为其他进程提供服务的。它能提供的服务有ActivityManagerService服务,PackageManagerService服务、WindowManagerService服务等。这些服务我们不知道也没关系,反正知道访问它可以获得一些服务就好。
App进程:当每个App运行时,系统都为其创建一个进程,这样一旦一个APP挂了都不会影响其它进程的运行
三大进程的通信
App与SystemServer通过Binder进行IPC通信,SystemServer与zygote通过Socket进行IPC通信
Launcher
在安卓系统中,当我们没有启动任何应用程序时,其实有这么一个应用程序一直在运行。正由于这个应用程序的存在,我们才可以和手机进行交互。这个应用程序就桌面应用程序---Launcher。其它应用程序安装后,会在Launcher界面上出现一个图标,点击这个图标后,Launcher就会将该应用程序启动起来。既然Andoroid中所有进程的始祖都是zygote,那么我们可以认为所有的APP始祖都是Launcher了。
下面是Launcher中的部分代码,我们把其中的onClick方法提取出来(Launcher代码位于android源码包中src/com/android/launcher2/Launcher.java)
/**
* Default launcher application.
*/
public final class Launcher extends Activity
implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks, AllAppsView.Watcher {
......
/**
* Launches the intent referred by the clicked shortcut.
*
* @param v The view representing the clicked shortcut.
*/
public void onClick(View v) {
Object tag = v.getTag();
if (tag instanceof ShortcutInfo) {
// Open shortcut
final Intent intent = ((ShortcutInfo) tag).intent;
int[] pos = new int[2];
v.getLocationOnScreen(pos);
intent.setSourceBounds(new Rect(pos[0], pos[1],
pos[0] + v.getWidth(), pos[1] + v.getHeight()));
startActivitySafely(intent, tag);
} else if (tag instanceof FolderInfo) {
......
} else if (v == mHandleView) {
......
}
}
void startActivitySafely(Intent intent, Object tag) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
......
} catch (SecurityException e) {
......
}
}
......
}
首先我们看到Launcher是Activity的子类,所以Launcher本质上也是一个Activity。当用户点击手机桌面上的应用图标后 Launcher会调用去onClick 方法,在该方法中会根据图标来产生一个 intent对象,然后通过调用startActivitySafely方法来启动该意图。在 startActivitySafely中我们看到为意图添加了FLAG_ ACTIVITY_ NEW_TASK属性(关于Intent的属性解释请见http://www.cnblogs.com/xiaoQLu/archive/2012/07/17/2595294.html)。然后调用startActivity方法来启动该意图。而这个意图对象是与我们应用中的那个被MAIN标记的Activity绑定的,这就是为什么我们一点桌面的图标出现应用界面的原因了。
App的启动
从上面可以看出启动一个App其实就是调用startActivity方法而已。但是真的有这么简单吗?我们前面说了,每个App必须运行在自己的进程中,那么起码得创建一个进程吧。App的启动流程基本如下:
- Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity。
- AMS让Launcher进入Paused状态
- Launcher告诉AMS进入Paused,AMS会通过Zygote进程来创建一个新的进程,这个进程会加载ActivityThread类,并执行其main方法(可以简答的理解为执行java ActivityThread命令)
- ActivityThread会将一个ApplicationThread类型Binder对象传递给AMS,以便以后可以通过该对象与AMS进行通信,然后ActivityThread进入loop循环。
- AMS会告知ActivityThread一切就绪了,那么Activity可以启动了。
这里的AMS我们称为Activity大管家,系统中所有的Activity都归他管理。但是大管家一般不干实事,它光指挥。ActivityThread就是我们所说的UI线程了,这也是主线程,毕竟人家运行的main方法,ActivityThread是与AMS交互来共同管理Activity生命周期的。但是对于Activity生命周期方法调用不是由ActivityThread完成的,而是由Instrumentation完成的。每个Activity都持有Instrumentation对象的一个引用,但是整个进程只会存在一个Instrumentation对象。三者的关系现在很明了了,AMS老板,ActivityThread组长,Instrumentation码农。
Android系统机制的更多相关文章
- Android系统机制解析-公共服务
创建一个公共服务类后有两种使用方式,第一种将公共服务放到自己的项目中执行,这样外界无法訪问和控制这个公共服务类.这个服务的全部变量.函数都在自己的项目中执行.能够直接通过startIntent(Ser ...
- 【Android 系统开发】 Android 系统启动流程简介
作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3889548 ...
- Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析
参考:Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析 一句话概括一下Android应用程序显示的过程:Android应用程序调用SurfaceFlin ...
- Android系统中的广播(Broadcast)机制简要介绍和学习计划
在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制:这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用:本文通过一个 ...
- [转]Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划
转自:Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划 前面我们从Android应用程序与SurfaceFlinger服务的关系出发,从侧面简单学习了Surfa ...
- 理解Android系统的进程间通信原理(二)----RPC机制
理解Android系统中的轻量级解决方案RPC的原理,需要先回顾一下JAVA中的RMI(Remote Method Invocation)这个易于使用的纯JAVA方案(用来实现分布式应用).有关RMI ...
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...
- Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6633311 在上一篇文章中,我 们分析了And ...
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系 ...
随机推荐
- Socket长连接和短连接的区别
https://blog.csdn.net/jasonjwl/article/details/52085264 短连接 连接->传输数据->关闭连接 HTTP是无状态的,浏览器和服务器每进 ...
- 阿里云CentOS6.8安装MySQL5.6
1.使用SSH Secure Shell工具连接阿里云服务器 2.使用SSH Secure File Transfer工具上传MySQL压缩包 3.解压MySQL压缩包到指定目录(需要在先/usr/l ...
- JS-textarea限制输入字数
解决办法: #descrip 是textarea的id,字数小于40: $("#descrip").on('input',function(event) { if ($(" ...
- 在input文本框中存入对象格式的数据
<input id="teaching" type="hidden" name="teachingProgram" /> JQ: ...
- ios 将图片做成圆形
UIImageView * imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"oiuyfdsa.png ...
- kindeditor在Java项目中的应用以及图片上传配置
在官网下载Kindededitor的开发包 在项目中javaweb项目中导入kindeditor必须要使用的Jar包(用于文件上传,除非你的富文本编辑器不使用图片上传)jar包可以在官网的开发包中 ...
- 160329(二)、web.xml配置详解
1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...
- Java中的常用方法
Java中的常用方法 第一章 字符串 1.获取字符串的长度:length() 2.判断字符串的前缀或后缀与已知字符串是否相同 前缀 startsWith(String s).后缀 endsWit ...
- Python全栈day10(Pycharm的安装和使用)
Python开发IDE 一,下载Pycharm专业版 二,安装Pycharm 三,新建项目 四,设置字体大小
- SignalR循序渐进(三)简易的集群通讯组件
上一篇演示了泛型Hub的实现,微软于6月17日更新了SignalR 2.1.0,然后自带了泛型Hub,于是就不需要自己去实现了…(微软你为啥不早一个月自带啊…).不过没关系,SignalR出彩之处不在 ...