Android进程和线程
来源:互联网 发布:北斗卫星定位精度知乎 编辑:程序博客网 时间:2024/05/21 06:50
Android进程和线程
当Android系统内存低下时,系统会杀死一些线程来释放内存,但是一个应用程序可能会有许多进程,系统要杀死哪个呢?这就要遵循一定的规则,例如:有两个线程都持有Activity,线程A持有ActivityA并且ActivityA不可见(例如你按下了Home键),线程B持有ActivityB并且ActivityB是可见的(例如现在它就显示在你的屏幕上)。那么系统就会杀死ActivityA所在的线程,因为杀死它只会对用户有很小的影响(因为它现在没有显示在屏幕上)。当然,这只是一种其中的一种情况,Android系统中存在很多状态不同的进程,那么内存不足的时候需要杀死哪个状态的进程呢?其实Android系统根据进程内运行的组件和组件的状态把进程分为了5个层次即5种重要级别,在需要杀死进程时,按重要性先杀死最不重要的,然后以此类推。
进程层次
进程分为以下几种层次:
1.前台进程(Foreground process):这个进程内运行的组件是当前用户进行的操作所必须的。线面这几种情况属于前台进程。
a.进程内运行了一个正在和用户交互的Activity。b.进程内运行了一个Service,这个Service和a中的Activity进行了绑定。
c.进程内运行了一个Service,这个Service调用了 startForeground()方法。
d.进程内运行了一个Service,这个Service正在执行他的生命周期方法(例如:onCreate,onDestory)。
f.进程内运行了一个Broadcast,这个Broadcast正在执行onReceive。
前台进程不到万不得已是不会被杀死的。
2.可见进程(Visible process):这种进程没有运行任何前台组件,但是仍然影响用户在屏幕上看到的。满足下面任何一种情况的就是可见进程。
a.进程包含了一个Activity,这个Activity可以被用户看见,但是它不在前台(之调用了onPause),比如说点击你当前Activity上面的按钮然后弹出了一个Dialog,这个Activity就是可见但不是在前台的。
b.进程包含了一个Service,这个Service和a中的Activity进行了绑定。
3.服务进程(Service process)
不满足1和2两种要求,并且进程内运行了一个用startService()开启的Service。
4.后台进程(Background Process)
该进程内运行了一个不可见的Activity,这种进程可以随时被杀死。
5.空进程(Empty Process)
这种进程没有运行任何组件,之所以让它存在是为了下次需要运行一个时候可以直接使用这个空进程,省去了重新创建新进程的时间。
还有几种情况,比如说一个进程既有前台的Activity又有一个没有绑定的Service,那么这个进程就是前台进程而不是服务进程(满足多个条件取级别最高的)。比如,A进程依赖B进程,那么A进程的级别最差也要和B进程同级。
Android线程
每个应用启动的时候系统都会为他创建一个主线程(也叫UI线程),这个线程会分发一些事件给android控件(例如点击事件,绘图事件)。Android不会为每个android组件实例创建一个新的线程,它们都运行在UI线程,但是一些耗时的操作不应该在UI线程里面进行(例如上传图片,I/O阻塞操作等)因为这样会使UI线程因为耗时操作而无法分发和响应事件从而导致ANR(android not response)。所以耗时操作应该启动一个子线程去处理。同时,因为UI线程不是线程安全的,所以不可以在别的线程内对UI线程进行操作(比如说在一个子线程内运行一段可以修改Imageview背景的代码),如果想在子线程处理数据然后显示在UI上,可以使用Handler,View.post(Runnable),Activity.runOnUiThread(Runnable),AsyncTask,View.postDelayed(Runnable, long)(请自行百度)等方法。
所以请记住以下两点:
1.不要再UI线程内进行耗时操作
2.不要再其他线程操作UI线程
- Android 进程和线程
- Android 进程和线程
- Android 进程和线程
- Android 进程和线程
- Android进程和线程
- Android 进程和线程
- android 进程和线程
- android 进程和线程
- android 进程和线程
- android 进程和线程
- android进程和线程
- Android 进程和线程
- Android进程和线程
- Android进程和线程
- android 进程和线程
- android进程和线程
- Android进程和线程
- Android进程和线程
- 优秀程序设计的18大原则
- Navicate for MySQL 的一点细节问题
- 分布式MySQL数据库TDSQL架构分析
- 【Leetcode算法】-Add Digits
- linux内存管理之vmalloc
- Android进程和线程
- linux内存管理之malloc
- Canonical Correlation Analysis 典型相关分析
- Mybatis系列(七)关联映射
- C++ core guidelines -- P.1. -- 直接在代码中表达你的想法
- linux内存管理之内存映射
- linux内存管理之DMA
- 【Leetcode算法】- Move Zeroes
- HDOJ 题目5442 Favorite Donut(后缀数组)