Android是一个多用户,多任务的系统。允许多个app在同一时刻执行,在多个程序之间切换并不会有明显的延迟。

多任务是由Linux内核负责处理的,而程序的运行基于Linux进程。

Linux进程

Linux为每一个用户分配一个唯一的用户ID(User ID),用于区分不同的User。

因为权限的原因,每一个用户只能访问私有资源,没有用户(除了Root用户,即超级管理员。我们这里不考虑这个用户。)可以访问其他用户的私有资源。因而,“沙盒”就用来独立这些用户。

在Android中,每一个应用都有一个唯一的用户ID,也就是说,Android中的App对应着Linux中的用户,并且App之间不能互访资源。

Android为每一个进程都添加了一个Dalvik虚拟机,也就是每一个app都对应一个Dalvik虚拟机。

下图展示了Linux进程,Dalvik虚拟机和App之间的关系。

默认,App和进程有一对一的关系。

但如果有需要的话,一个App可以在几个进程中运行,或者几个App在同一个进程中运行。

生命周期

App的生命周期被封装在它自己的Linux进程中,从Java的视角来说,就是android.app.Application类。

当Dalvik调用Application的onCreate()方法时,Applicationg对象就被生成了。理想情况下,Dalvik调用Application的onTerminate()的时候,app就停止了。

但切记,不能依靠这个去判断一个Application对象被销毁了!

因为潜在的Linux进程或许已经被Kill掉了,这个时候Dalvik还没有调用onTerminate()。

总之,Application对象是在一个进程中第一个被实例化的对象,也是最后一个被销毁的。

App启动

当一个App的任何一个组件被激活的时候,这个App就被开启了。

任何组件都是App的入口。还记得吗,组件包括:Activity,BroadcastReceiver,Service和ContentProvider。

当第一个组件被激活的时候,这个App的Linux进程就被激活了,除非这个Linux进程已经处于运行状态。

App开启的过程总结如下:

  1. 开启Linux进程.
  2. 创建Dalvik虚拟机.
  3. 创建Application实例.
  4. 创建App的入口组件.

建立一个新的Linux进程和Dalvik虚拟机并不是一个瞬时的操作。这个过程会降低性能,并且对用户体验稍有影响。

因此,Linux系统通过在启动(系统启动)的时候开启一个特别的Zygote进程去缩短App的启动时间。

这是怎么回事呢。Zygote包括了所有预加载的核心库,新的App进程就是从这个Zygote进程孵化出来的,但是App进程并不会复制那些预加载的核心库,而是共用Zygote的核心库。

就是这样,缩短了App的启动时间。

App终结

在App启动的时候,Linux进程被创建,当系统需要回收资源的时候Linux进程终结。为了保证用户每次进入App时不会重复上面的流程。如果不是真的到了资源缺的地步,Dalvik是不会销毁这个App的所有资源的。因此,尽管一个App的所有组件都被销毁了,这个App也不会自动终结。

当系统处于资源紧缺的时候,Dalvik负责决定哪一个进程要被Kill掉。那到底是基于什么去决定是哪一个进程呢?

基于App的可见性和它的组件运行情况,系统对进程进行分级处理。也就是说,低级别进程在高级别进程之前被Kill掉。

下面是进程的各个级别:

Foreground
App在前台有可见的组件,或者有一个Service与其他进程中的某个可见的Activity处于绑定状态,或者BroadcastReceiver正在运行。
Visible
App有一个部分可见的组件。
Service
Service处于运行状态,但是并没有和一个可见的组件绑定。
Background
不可见的Activity。
Empty
没有活跃组件的进程。空进程之所以存在,就是为了改善App的启动次数,但是它们也会第一个被Kill掉。

参考资料

http://developer.android.com/guide/components/processes-and-threads.html#Lifecycle

【并发编程】程序的启动和终结相关推荐

  1. 《Java并发编程实战》【第二部分 结构化并发应用程序】

    文章目录 第6章 任务执行 6.1 在线程中执行任务 6.1.1 串行的执行任务 6.1.2 显式地为任务创建线程 6.1.3 无限制创建线程的不足 6.2 Executor框架 6.2.1 示例 基 ...

  2. 并发编程不是少数派技能,每个程序员都要尝试掌握

    题图 | <七周七并发编程>封面图案 新手程序员一般会对并发编程和多线程编程避而远之,因为它们会让本来好好的代码以最可怕的方式运行,而且竞争条件等各类问题会引发严重的崩溃,要么是在生产环境 ...

  3. python并发编程书籍推荐_《吐血整理》-顶级程序员书单集

    <程序人生>十年风雨技术人的书单整理 前言 王潇:格局决定了一个人的梦想,梦想反过来决定行为. 那格局是什么呢? 格局是你能够看见的深度.广度和密度. 王潇认为,格局是一本本书搭建起来的, ...

  4. 并发编程含义比较广泛,包含多线程编程、多进程编程及分布式程序等 目录 1. “共享内存系统”,消息传递系统”。 1 1.1. 共享模式 多进程 多线程 1 1.2. Actor消息模式 事件驱动 2

    并发编程含义比较广泛,包含多线程编程.多进程编程及分布式程序等 目录 1. "共享内存系统",消息传递系统". 1 1.1. 共享模式 多进程 多线程 1 1.2. Ac ...

  5. 【2021最新版】Python 并发编程实战,用多线程、多进程、多协程加速程序运行

    [2021最新版]Python 并发编程实战,用多线程.多进程.多协程加速程序运行 视频地址:https://www.bilibili.com/video/BV1bK411A7tV/ P1 Pytho ...

  6. 计算机网络套接字编程实验-TCP多进程并发服务器程序与单进程客户端程序(简单回声)

    1.实验系列 ·Linux NAP-Linux网络应用编程系列 2.实验目的 ·理解多进程(Multiprocess)相关基本概念,理解父子进程之间的关系与差异,熟练掌握基于fork()的多进程编程模 ...

  7. 黑马程序员并发编程笔记(二)--java线程基本操作和理解

    3.java进程的基本操作 3.1.创建进程 方法一,直接使用 Thread // 构造方法的参数是给线程指定名字,,推荐给线程起个名字(用setName()也可以) Thread t1 = new ...

  8. 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析

    文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...

  9. Java并发编程实战 代码bug,Java并发编程实战(1)- 并发程序的bug源头

    概述 并发编程一般属于编程进阶部分的知识,它会涉及到很多底层知识,包括操作系统. 编写正确的并发程序是一件很困难的事情,由并发导致的bug,有时很难排查或者重现,这需要我们理解并发的本质,深入分析Bu ...

最新文章

  1. XAML实例教程系列 - 命名空间(NameSpace)
  2. Spring Cloud Hoxton.SR8 发布
  3. Flex DataGrid可编辑对象实现Enter跳转
  4. 计算机word基础知识菜单,Word试卷模板_电脑基础知识_IT/计算机_资料
  5. pythonfillcolor_openpyxl 填充颜色(单元格)
  6. postgre ~模糊查询慢解决方式
  7. oracle10g   RMAN增量备份策略
  8. 学生宿舍管理系统HTML代码,学生宿舍管理系统源代码.doc
  9. 电商网站项目总结(面向对象编程篇)
  10. 计算机绘图国标规定,机械制图教程(1.1)国家标准关于制图的一般规定
  11. chmod 权限详细解析(rw)
  12. 企业级和个人苹果帐号AppleId申请
  13. 基于SG90舵机(伺服电机)的操作笔记
  14. 数据中心机房物理建设
  15. OpenCloner Ripper:集光盘翻录软件+光盘视频转换+光盘解密于一体的全能光盘工具
  16. bluemix_使用Bluemix采用混合云模型
  17. win7支持的最新nodejs版本
  18. 实验7-2-8 找鞍点 (20分)
  19. 『杭电1878』欧拉回路
  20. php 导致服务器成肉鸡,把我的服务器搞成了ddos肉鸡,如何解决?

热门文章

  1. Flutter学习记录——23.实现一个类似淘宝的商品展示页面
  2. 软件测试 | 测试开发 | 智能音箱语音交互系统简介与测试初探
  3. 广度优先搜索算法及其MATLAB实现
  4. Excel 2010中的条件格式
  5. Symbian OS 开发初级手册 9(转)
  6. EXCEL-SUMIFS多条件求和(筛选效果)
  7. 关于线索二叉树的详解
  8. 万年历-java课程设计题_万年历-Java课程设计题(eclipse编辑器)
  9. 轮毂、轮辋、轮圈,你还分不清楚?
  10. 红灯检测宇视科技专利分析与总结1