Android中的进程和线程

来源:互联网 发布:ceic数据库与wind 编辑:程序博客网 时间:2024/05/16 17:34

进程(Processes)

当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。同一个程序的所有组件默认都运行在同一个进程中,如果有多进程的需要也可以通过修改manifest文件实现。在manifest文件中的所有支持 android:process属性的那些项(<activity>,<service>, <receiver>, 和 <provider>)都可以指定一个进程,你可以设置这个属性使每个组件运行于其自己的进程或只是其中一些组件共享一个进程。另外<application>元素也支持android:process属性, 用于为所有的组件指定一个默认值。

Android 系统会尽量维持一个进程的生命,直到最终需要为新的更重要的进程腾出内存空间。Android会根据进程中运行的组件类别以及组件的状态把进程置于不同的重要性等级(importance hierarchy),当需要系统资源时,重要性等级越低的先被淘汰。
重要性等级从高到低一共被分为5个档:

前台(Foreground)进程

1.这个进程拥有一个正在与用户交互的 Activity(这个Activity的onResume()方法被调用)。
2.这个进程拥有一个绑定到正在与用户交互的activity上的Service。
3.这个进程拥有一个前台运行的Service(service调用了方法 startForeground()
4.这个进程拥有一个正在执行其任何一个生命周期回调方法(onCreate(),onStart(), 或 onDestroy())的 Service。
5.这个进程拥有正在执行其 onReceive() 方法的 BroadcastReceiver。
任一时间下,仅有少数进程会处于前台,仅当内存实在无法供给它们维持同时运行时才会被杀死。一般来说,在这种情况下,设备已然处于使用虚拟内存的状态,必须要杀死一些前台进程以用户界面保持响应。

可见(Visible)进程

1.这个进程拥有一个不在前台,但仍然为用户可见的activity(它的onPause()方法被调用)。这种情况可能出现在以下情况:比如说,前台activity是一个对话框,而之前的activity位于其下并可以看到。
2.这个进程拥有一个绑定至一个可视的activity的服务。
可视进程依然被视为是很重要的,不包含前台的组件但是会在屏幕上显示,除非前台进程需要获取它的资源,不然不会被中止。

服务(Service)进程

1.这个进程拥有一个绑定到可见activity的Service
2.这个进程拥有一个由startService()方法启动的Service
虽然这些进程用户无法直接看到服务,但它们做的事情却是用户所关心的(例如:后台 MP3 回放或后台网络数据的上传/下载)。所以系统会尽量维持它们的运行,除非系统内存不足以维持前台进程和可视进程的运行需要。

后台(Background)进程

这个进程拥有一个当前不可见的activity(activit 的onStop()方法被调用)。
系统中通常有很多这样的进程在运行,因此要将这些进程保存在LRU(最近最少使用)列表中,以确保当内存不足时用户最近看到的进程最后一个被杀死如果它们正确执行了Activity生命周期,并保存了它的当前状态,那么杀死它的进程将不会对用户的可视化体验造成影响系统可以在任意时刻杀死进程来回收内存,并提供给前面3种类型的进程使用。因为当用户返回到这个activity时,这个activity会恢复它所有的可见状态。

空(Empty)进程

这个进程不拥有任何active组件。
保留这类进程的唯一理由是做为缓存以改善组件再次于其中运行时的启动时间,当下次应用程序的某个组件需要运行时,不需要重新创建进程,这样可以提高启动速度。
系统经常为了平衡在进程高速缓存和底层的内核高速缓存之间的整体系统资源而杀死它们。

Android会跟据进程中当前活动的组件的重要性把进程按排在其可能的最高级别。
例如,如果一个进程拥有一个service和一个可见的activity,进程会被定为可见进程,而不是服务进程。
另外,如果被其它进程所依赖,这个进程的级别可能会被提高。一个为其他进程服务的进程,其级别不可能比被服务进程低。所以运行着一个service的进程重要级别总高于一个后台activity的进程。因此当一个activity启动需一个耗时操作时,最好是启动一个service,而不是简单的创建一个工作线程尤其是当这个操作可能比activity本身存在时间要长的情况之下。
使用一个service 保证了这个操作至少是在" 服务进程 "级别,而不用管activity是否发生了什么不幸。同样,广播接收者应该启用一个service而不是简单地开一个线程。

线程(Threads)  

    线程在代码中是以标准Java Thread对象创建的。尽管你可以把你的应用程序限制于一个单独的进程中,有时你仍然需要衍生出一个线程以处理后台任务。
因为用户界面必须非常及时的对用户操作做出响应,所以控管activity的线程(UI thread)不应用于处理一些诸如网络下载之类的耗时操作,所有不能在瞬间完成的任务都应安排到不同的线程中去。用之前所介绍的AsyncTask管理UI线程以外耗时线程非常方便。
另外也Android提供了很多便于管理线程的类:Looper用于在一个线程中运行一个消息循环,Handler用于处理消息,HandlerThread用于使用一个消息循环启用一个线程。

0 0
原创粉丝点击