进程是程序的一次执行,是系统进行资源分配和调度的基本单位,有本身专属的内存资源。java
进程是操做系统上的概念,因此不管在PC端仍是移动端都是存在的,进程在PC端上,表现为程序,好比音乐播放器,聊天软件等;在手机上,就是一个个应用软件。android
先看一张图编程
从上面这张图,咱们能够看出来,进程包含线程。一个进程里能够有多个线程,这样的一个关系。缓存
每一个进程都有一块属于本身的由操做系统分配的内存,默认的状况下,A进程的内存区域不能和其余进程共享。刚刚用了一个默认状况的描述词。说到进程间不能共享数据,这也不是绝对的。在特殊的状况下也是能够共享的,这种状况就是IPC机制。IPC机制全称叫作:inter-process communication ,即进程间通讯。关于IPC机制,目前知道就好,本文不详细讨论IPC机制,后续有专门写篇文章讲述Android系统的IPC机制。网络
线程跟进程不同,进程是不能共享内存,而线程能够。线程是包含于进程的。线程用的内存都是从其对应的进程那分配过来的。线程因为其容易建立,内存共享,适用并发场景等特性,常被称为轻量级进程。由于线程间能够共享数据,因此在并发编程中开经常会出现一个不当心从而致使并发问题,也就是多线程间数据不一样步致使的问题。这点在多线程开发中要注意。多线程
在Android系统中,默认状况下,APP开发是单进程的。通常来讲,关于多进程的业务需求也比较少,因此单进程彻底够用。若是须要多进程的话,Android也是提供了方法来实现多进程。方法就是在Android Manifest文件中,为android 四大组件设置android:process属性。默认状况下,都是运行在同一个进程中的,默认进程名是应用包名。并发
举例说明:app
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity"
android:process=":second"
>
</activity>
<activity android:name=".ThirdActivity"
android:process="com.example.rainyang.demo.third"
/>
复制代码
MainActivity 是运行在默认进程,进程名为应用包名:com.example.rainyang.demo;ide
SecondActivity 运行的进程名为:com.example.rainyang.demo:second,:是一种简写,表示在当前进程名前加上包名;spa
ThirdActivity 运行的进程名为:com.example.rainyang.demo.third。
上面举的例子是用四大组件之一的Activity表示的,同理,process属性在Service、ContentProvider、Broadcast中是同样的使用方式,同样的效果。
进程也是有优先级的划分的,你想啊,手机的内存就那么大,当运行多个进程(app)的时候,系统内存告急,当前正在使用的进程须要内存,怎么办?总不能不给内存,让用户无法使用吧。此时系统会根据进程的优先级来选择杀死优先级最低的进程,回收其内存,而后再把内存分配给,用户当前正在与其交互的进程。从而保证用户的正常的使用。
接下来咱们看关于进程的分类。
进程分类是依据进程的优先级高低为标准,进行的分类。下面将从优先级从高到低的顺序分别介绍各类进程。
前台进程是用户正在与其交互的进程,是当前正在执行的操做所必须的进程。知足下面任何一条件的状况,其所在的进程都属于前台进程。
前台进程是优先级最高的,通常来讲,系统不会kill它,回收它的内存。你想啊,前台进程是用户正在使用操做的进程,忽然让系统回收了,那用户体验得多糟糕。对于前台进程它通常是系统为其服务的进程,正式由于前台进程须要内存,系统才会去kill其余进程,回收内存,来知足它。
经过上面知足前台进程的几种状况,能够发现,这些状况都是和Android四大组件有关系的。再看看以前说到的设置多进程的方式,是在四大组件中经过process属性来设置。这些都是遥相呼应的。必定程度上能够理解为,四大组件就表明和实现了APP进程。
可见进程是正在作一些用户关心的事,它的优先级虽然比前台进程优先级低,可是从它的描述词——"用户关心" 就能够看出,不能轻易杀死它,否则用户心理确定不爽。当知足下面任一状况,表示其所在进程为可见进程:
这种进程,优先级也比较高,通常不轻易杀死。
当Service组件调用startService()方法来启用一个服务时,该服务所属进程为服务进程。尽管服务进程不会像前台进程,可见进程那样直接对用户可见的,可是在服务进程中常常会用用户所关心的一些事,好比后台网络数据的上传下载逻辑。因此除非内存不够用了,通常不会在内存够用的状况下去杀死服务进程。
已经运行了很长时间(例如30分钟或更长时间)的Service可能会降级,以容许其进程降低到下面描述的缓存LRU列表。 这有助于避免出现内存泄漏或其余问题的长时间运行服务占用大量RAM而致使系统没法有效使用缓存进程的状况。
缓存进程是优先级最低的进程,当其余地方须要内存的时候,系统会优先考虑杀死该进程。(真可怜。。),杀死该类进程对用户体验不会形成影响。
通常来讲,系统中会有多个缓存进程,目的是在应用间切换的起到更有效切换的做用(缓存嘛,备胎既视感),并根据系统须要,按期的清理最老的缓存进程。系统在全部的缓存进程都杀死回收内存后,还不知足所须要的内存,就会选择向服务进程下手。
经过上面对几种进程类型的理解,开发者就能够根据需求,把逻辑放在合适的进程中,避免重要业务逻辑放进低优先级的进程中,从而致使服务被杀死,用户体验很差,这种状况。
IPC(inter-process communication) 进程间通讯,文章开头有提到过。其机制的做用是为了知足多进程间通讯的需求。Android系统中,多进程通讯的方式有Binder、AIDL(内部也是Binder)、Socket、ContentProvider等等。关于IPC机制的实现,后面的文章在详细讲解。
创做不易,以为还不错的话,就点个"赞"鼓励下吧!