Android 线程完全解析

关于安卓的进程和线程相信大家都有一定的的概念,这篇文章会详细的解释Android的进程和线程的基本概念和重要只是。也权当是自己的一点记录

Android线程

Thread线程这个类在java就经常使用,Android中自然也少不了。那么线程到底是什么,来看看维基百科的解释 :

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

从维基百科的解释可以看出作为运算调度的最小单位,我们在Android系统中的操作都是在线程中执行,而在Android系统中线程又是运行在Linux进程中。进程可以理解为程序的一个执行过程,自然一个进程的中可以运行多个线程,多个线程会共享进程的内存资源。这样就形成了一种多线程,高并发的运行模式可以极大的提高程序的运行效率。

Android的线程模型

Android系统中当一个程序启动,并且这个程序没有其他的组件在运行的时候,Android系统会为这个程序创建一个一个包含单个线程的Linux线程,这个单个线程可以被称为 main thread 主线程(也就是我们都知道UI Thread),默认情况下,这个程序的所有组件都运行在同一个进程和线程里。

以上的解释来自谷歌的官方说明,可以看出来Android是一种单线程的模型,所有的操作都默认在main thread上。这里顺便插一句,当这个程序已经有其他的组件运行时,那么当这个程序启动时,会在已有的进程和线程中执行。当然我们完全可以让我们的组件在不同的进程中运行具体方法,下面会给大家介绍。

  • 进程
    默认情况下,同一个应用程序内所有的组件都是运行在同一个进程中,大部分应用都这样,事情总会有特殊情况,如果你想让特定组件运行在其他进程,只需要在manifest文件中配置就可以完成。
    manifest文件中的每个组件,都支持自定义 android:process属性来指定该组件运行的进程:

    <activity
        android:name="com.xxx.CutImageActivity"
        android:process=":gallery">
    </activity>
    

这样我的CutImageActivity就运行在了一个名为gallery的进程中

  • 进程的生命周期
    我们的Android系统总是会尽可能的长时间的保持应用程序的进程,但是在运行的过程中用户会开启各种App,终于内存不够用了,安卓机器人开始杀进程了。怎么杀呢,我们的绿色机器人当然是很公正的,Android系统中每一个进程都被分了等级,等级最低的优先杀掉,大家按顺序排队一个一个杀。这个等级如何划分呢
    (1)前台进程
    前台进程是用户完成当前操作所必须的进程。比如:
    运行正在与用户交互的activity(activity的onResume()方法被调用)
    运行正在与用户交互的activity中绑定的服务
    运行“前台”服务,即服务以startForeground()方法被调用
    运行正在执行生命周期回调方法(onCreate(),onStart(),或onDestroy())的服务。记住是服务
    运行正在执行onReceive()方法的BroadcastReceiver
    通常前台进程的数量不会很多,但内存不足时,他们是最后被终止的。
    (2)可见进程
    可见进程是没有前台组件的情况下仍会影响屏幕上的显示的进程。简单点说就是不在前台的activity,但是用户仍然可以看见这个activity(运行了onPause()方法),比较典型的情况就是Activity中打开对话框,此时这个activity依然显示在后面,当然这个activity绑定的服务运行的也是属于可见进程。
    可见进程是非常重要的进程,除非无法保证所有前台进程的运行,才会杀可见进程
    (3)服务进程
    从他的名字可以判断,找个进程跟服务有关。的确服务进程运行着由 startService()方法 启动的服务,同时这个进程不会上升为上面所说的2个级别。这个进程通常会进行音乐播放,网络下载的操作。最后当内存不够前台和可见进程运行时,就会杀这个服务进程。
    (4)后台进程
    后台进程包含目前用户不可见的activity,这些进程不会对用户的体验造成影响,系统可以在任意时间终止这些进程,来回收内存
    (5)空进程
    进程如其名就是个空的,不含任何活动应用程序组件的进程,它的作用就是缓存,以改善选出在此进程中运行组件的启动时间,这个进程当然最优先被杀死。
    就这样我们所有的进程都进行了分类,这里可以看出如果要进行一个长时间的操作,建议用服务去运行,因为我们无法长时间的去占用前台,而服务进程又是高于后台进程的。所以用服务区执行长时间的操作是最合适的。
  • 主线程
    大名鼎鼎的主线程 main thread 相信做安卓开发的人都知道。应用程序在启动的时候,系统会为他创建一个名为 main 的主线程,他负责把事件分发给相应的用户界面,包括屏幕的绘图事件,他也是应用程序与Android UI 组件包进行交互的线程,可以说我们的界面做的所有事情都是在这个线程上。所以这个线程有时候也叫 UI Thread。
    由于这个线程是如此的重要,并且Android UI 组件包又不是线程安全的,所以Android不允许从工作线程(就是非 UI Thread 的线程)直接操作UI 界面。同时这个UI Thread要执行繁重的界面工作,所以一旦这个线程发生阻塞 超过一定时间 (大约5秒),就会导致ANR的发生,这是非常严重的错误。我们的App或许就这样被卸载了。所以我们在开发中要遵守2个基本原则:不要阻塞UI 线程
    不要从UI 线程之外的线程去访问 Android UI组件包 (当然这条大家都知道应该怎么做)**
  • 工作线程
    Android的单线程模式当然无法满足我们的开发需求,开发的过程中为了保证运行效率总会去开启新线程来执行一些操作,这些可以被称为工作线程,同时Android系统也考虑到了这种情况,提供了 AsyncTask这个异步任务类来处理工作线程。
    关于AsyncTask会在下片文章中介绍

你可能感兴趣的:(android,线程,进程)