Android进程模型

Android进程简介

 

    1.Android是基于Linux的一个操作系统,在Android中,进程(process)的概念被弱化,在Android中进程只是一个运行组件的容器,当系统需要运行一个程序时,启动包含它的进程。当这个程序没有必要再运行下去且系统需要回收这个进程的内存用于其他程序时,这个 进程就“死亡”了。所以说Android 程序的生命周期是由系统控制而非程序自身直接控制。

    2.当我们打开一个应用程序时,就会开启一个进程。但是当我们退出应用程序时(比如双击两下back键退出程序)不是所有的应用程序进程都被销毁,可能还会有一些进程在后台运行(空进程)。要通过滑动应用程序卡片,通过应用管理杀死进程或者点击清理后台数据按钮时,进程才会被杀死。有或者等待系统资源紧缺时,系统自动杀死该进程。

    3.在linux中,当初始化内核之后,就会启动一个相当重要的祖先进程,也就是init进程,在Linux中所有的进程都是由init进程直接或间接fork出来的。

    4.而对于Android来说,前面的流程都是一样的,而当init进程创建之后,会fork出一个Zygote([ˈzaɪgəʊt])进程,这个进程是所有Java进程的父进程。因为,Linux是基于C的,而Android是基于Java的。所以这里就会fork出一个Zygote Java进程用来fork出其他的进程。

 

 

 

Android进程模型

    在安装Android应用程序的时候,Android会为每个程序分配一个Linux用户ID,并设置相应的权限,这样其它应用程序就不能访问此应用程序所拥有的数据和资源了。在 Linux 中,一个用户ID 识别一个给定用户;在 Android 上,一个用户ID 识别一个应用程序。应用程序在安装时被分配用户 ID,应用程序在设备上的存续期间内,用户ID 保持不变。
    默认情况下,每个apk运行在它自己的Linux进程中。当需要执行应用程序中的代码时,Android会启动一个jvm,即一个新的进程来执行,因此不同的apk运行在相互隔离的环境中。

    下图显示了:两个 Android 应用程序,各自在其自己的基本沙箱或进程上。他们是不同的Linux user ID。

    开发者也可以给两个应用程序分配相同的linux用户id,这样他们就能访问对方所拥有的资源。为了保留系统资源,拥有相同用户id的应用程序可以运行在同一个进程中,共享同一个jvm。
    如下图,显示了两个 Android 应用程序,运行在同一进程上。

 

进程的状态

 

    Android 系统将尽量长时间地保持应用进程,但为了新建进程或运行更重要的进程,最终需要移除旧进程来回收内存。进程被系统强制销毁时,是按照进程的优先级进行的。而进程的优先级主要和应用包含的组件相关。进程优先级从高到低可分为五种:前台进程、可视进程、服务进程、后台进程、空进程。

1.前台进程(ActiveProcess)
    用户进行操作所必须的进程。一般满足以下条件:
    (1)屏幕顶层运行Activity(处于onResume()状态),用户正与之交互
    (2)有BroadcastReceiver正在执行代码
    (3)有Service在执行其回调方法(onCreate()、onStart()、onDestroy())中的代码

    任一时间下,仅有少数进程会处于前台,仅当内存实在无法供给它们维持同时运行时才会被杀死。

2.可视进程(VisibleProcess)
    没有前台组件,但仍可被用户在屏幕上所见。当满足如下任一条件时,进程被认为是可视的:
 (1)它包含着一个不在前台,但仍然为用户可见的activity(它的onPause()方法被调 用)。这种情况可能出现在以下情况:比         如说,前台activity是一个对话框,而之 前的 activity位于其下并可以看到。
 (2)它包含了一个绑定至一个可视的activity的服务。
 (3)含有用户意识到的特定的服务,如动态壁纸、输入法等
    可视进程依然被视为是很重要的,非到不杀死它们便无法维持前台进程运行时,才会被杀死。

 

3.服务进程(StartedServiceProgress)
    已经启动的Service的进程。或者称为是后台的Service(由 startService() 方法启动的服务),该Service没有直接和用户交互。虽然该进程用户不直接可见,但是它们一般做一些用户关注的事情(如数据的上传与下载)。虽然他比可见Activity和前台Service的优先级别低。但是系统会尽量维持它们的运行,除非系统内存不足以维持前台进程和可视进程的运行需要。

4.后台进程(BackgroundProcess)
    不可见、并且没有正在运行的Service的Activity的进程,包括:
(1)目前不为用户所见的activity(Activity对象的 onStop() 方法已被调用)。
(2)长时间运行的service(如30分钟以上),系统会考虑将之降级为缓存进程,避免            长时间运行导致内存泄漏或其他问题,占用过多RAM以至于系统无法分配充足资源给缓存进程。
    这些进程与用户体验没有直接的联系,可以在任意时间被杀死以回收内存供前台进程、可视进程以及服务进程使用。一般来说,会有很多背景进程运行,所以它们一般存放于一个LRU(最后使用)列表中以确保最后被用户使用的activity最后被杀死。如果一个activity正确的实现了生命周期方法,并捕获了正确的状态,则杀死它的进程对用户体验不会有任何不良影响。

 

5.空进程(emptyProcess)
    不含任何活动应用组件的进程。保留这种进程的的唯一目的是用作缓存,为了提高系统整体性能,Android经常在应用程序的生存期结束之后仍然把它们保留在内存中,Android通过维护这个缓存来减少应用个程序被再次启动时的启动时间。通常这些进程会根据需要被定期终止。

一个进程的级别可能会由于其它进程依赖于它而升高。一个为其它进程提供服务的进程级别永远高于使用它服务的进程。比如说,如果A进程中的内容提供者为进程B中的客户端提供服务,或进程A中的服务为进程B中的组件所绑定,则A进程最低也会被视为与进程B拥有同样的重要性。
 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值