Android系统会尽可能时间长的来维持一个程序的进程,但当系统资源紧张的时候,系统终究会为一些新的或者更重要的进程杀死一些旧的进程来释放内存。系统主要是根据进程中组件的运行状态,来决定每一个进程的重要性,从而决定哪个进程需要杀死,哪个进程需要保持。最不重要的进程最容易先被杀死,其次最不重要的进程会被杀死,以此往复,直到系统恢复了需要的资源。
既然系统主要根据进程的重要性来决定一个进程的存亡,下面我们就将介绍根据重要性分类的五种不同进程(重要性由高到低)。
1.foreground process,前台进程
所谓前台进程就是指用户完成当前工作而需要的进程。判断条件如下(满足其一即可):
-进程中的某个Activity正在与用户进行交互(Activity的onResume()方法被调用)
-绑定到与当前用户正在交互的activity的Service所在的进程
-进程中的某个Service正运行在前台,即这个service的startForeground()方法被调用
-进程中的某个Service正在执行生命周期回调方法(比如,onCreate(),onStart(),或者onDeatroy())
-进程中的BroadcastReceiver正在执行onReceive()方法。
一般来说的话,在某特定时刻,也仅会有为数不多的几个前台进程。这些前台进程的重要性最高,当系统内存低到很低,以致不能继续运行这些所有的进程的话,系统将会杀死这些进程。这种情况下,一般是指系统已经到了一个极限边缘了,所以为了让UI继续有反应的话,系统不得不杀死一些前台进程。
2.可视进程-visible process
可视进程是指没有前台运行的组件,但仍然会对用户在屏幕看到的内容造成影响的进程。满足下面条件的进程都可以算作可视进程:
-进程运行的Activity不在前台,但仍然是可见的(调用了onPause()方法)。这种情况可能是这样的,正在前台运行的Activity启动了一个对话框,这个对话框悬浮在这个activity之上,但仍有部分可见。
-进程中的Service绑定到了一个可视(或前台)的activity(该activity已调用了onPause()方法)。
可视进程也是有着极高重要性的进程,只有在系统为了保持前台进程运行而不得不杀死可视进程的时候,才会杀死可视进程。
3.服务进程-service process
所谓的服务进程,就是指除了上面两种进程外,如果一个进程已经通过startService()方法启动了一个service的进程。虽然这种service进程跟用户的看到的内容不相关,但它们所做的工作也是用户关心的(比如在后台播放音乐或者正在下载互联网上的资源),系统会一直保持服务进程,除非系统为了前台进程和可视进程的运行,而不得不杀死服务进程。
4.后台进程-background process
后台进程是指进程中的activity当前对用户来说不可见(这个activity调用了onStop()方法)。后台进程不会对用户的体验造成任何影响,并且系统可以在前台进程、可视进程、服务继承需要内存资源的时候会杀死后台进程。通常会有很多后台进程运行,并且这些后台进程保存在一个最近使用列表中,这样做的好处就是保证用户最近看到的进程最后被杀死。如果一个activity已经正确的实现了生命周期方法,并且保存了当前的状态,那么系统杀死这些后台进程对用户的可视效果来说的话,没有任何影响,因为当用户返回回来的时候,这个activity已经保存了所有的可视状态。
5.空进程-empty process
一个空进程没有任何运行的程序组件。系统保持空进程存在的唯一原因就是为了缓存方面的考虑,这样做主要是为了提高组件的启动时间。系统经常会杀死这些空进程来保持整个系统资源和内核缓存之间的平衡。
Android根据进程中运行的最重要的组件进行划分进程的重要性,比如说,如果一个进程中即有一个可视的activity,又有一个service,那么这个进程应该属于可视进程而不是服务进程。
另外,一个进程的重要性等级可能会因为依赖于该进程的其他进程而提高——一个服务于其他进程的重要性不会低于被服务的进程。比如说,进程A中的一个content provider正在为进程B中的客户服务,或者进程A中的一个service被绑定到了进程B中的一个组件,那么进程A的重要性至少会被认为是和B的重要性是一样的。
因为一个正在运行的服务所在的进程的重要性高于一个处于后台的activity所在的进程,所以根据这一点,如果一个activity如果要执行需要长时间运行的操作的话,这个activity最好为该操作启动一个新的服务,而不是仅仅创建一个工作线程,尤其是当这个工作线程运行的时间可能比该activity的运行时间还长的时候。比如说,如果一个activity要往一个网站上上传一张图片的话,这个activity就应该启动一个服务来完成这个上传操作,这要做的好处就是即使用户离开了当前的这个activity,上传服务还会继续进行。使用一个服务保证一个进程至少还有服务进程这个优先级,而不用担心activity会发生什么情况。这也正是为什么广播接收者应该使用服务而不是把耗时的操作放在一个线程中的原因。
相关推荐
首先,理解Android进程的生命周期和优先级至关重要。Android系统根据各个应用组件所处的进程的重要性,将其分为多个等级,包括前台进程、可见进程、重要服务进程、后台进程和服务进程。优先级越高,系统在内存不足时...
本文将详细探讨Android进程的五种优先级以及系统如何进行进程回收。 1. **进程优先级** Android将进程分为五个等级,按重要性排序: - **前台进程**:当前用户正在直接交互的进程,如运行中的Activity和前台...
1. **进程等级**:Android系统根据进程与用户交互的重要性将其分为五级:前台进程、可见进程、服务进程、后台进程和空进程。保活策略主要针对服务进程和后台进程,因为它们较容易被系统回收。 2. **服务(Service)...
这个类提供了关于当前正在运行的应用进程的详细信息,包括进程的importance等级、进程名以及关联的包名等。你可以通过注册`BroadcastReceiver`监听`ACTION_TASK_RESUMED`和`ACTION_TASK_PAUSED`广播来间接获取进程...
`RunningAppProcessInfo`对象包含了关于正在运行的应用进程的信息,如进程ID、重要性等级和包名等。 3. **解析数据**:在获取到`RunningAppProcessInfo`列表后,你可以遍历它来获取每个应用的详细信息,比如找出...
1. **进程优先级**:根据进程的类型和当前状态,Android会赋予每个进程不同的优先级。 2. **生命周期管理**:进程的生命周期管理对于内存管理非常重要。例如,当内存紧张时,Android会优先终止那些处于非活跃状态的...
2. Android进程生命周期和状态转换。 3. 进程优先级的分类及其影响因素。 4. 如何通过编程方式改变进程优先级。 5. OOM Killer的工作原理和内存管理策略。 6. JobScheduler和WorkManager的使用方法及其优势。 理解...
Android提供了SharedPreferences和FileInputStream/OutputStream等工具,可以用来保存玩家的分数、等级等信息,或序列化游戏状态。 七、游戏逻辑 "跳动的心"游戏的源码必然包含了游戏的逻辑规则,如得分系统、关卡...
在移动设备日益普及的今天,教育领域的数字化进程也愈发加速,基于Android平台的模拟考试系统成为了教学辅助的重要工具。本系统采用Java编程语言,利用Apache开源技术,实现了包括单选题、多选题、判断题在内的全面...
Android 系统中的进程优先级从高到低分为多个等级,这决定了应用的执行效率和资源分配。在 Android 应用中,主要的四大组件是 Activity、Service、BroadcastReceiver 和 ContentProvider。 Activity 是应用程序的...
Root是获取Android设备最高等级权限的过程,这样用户就可以完全控制设备,包括修改系统文件、删除预装应用、提升设备性能等。对于取证人员来说,Root设备同样可以提供对设备文件系统的完全访问权限,从而更深入地...
进程的重要性分为五个等级:前台进程、可见进程、服务进程、后台进程和空进程。这五个级别的划分基于进程内组件的类型和状态,用于优化内存管理。例如,前台进程是用户当前正在使用的,系统会尽可能保留;而后台进程...
相比之下,在Android 1.0中,设置Service为前台状态的方法是通过`setForeground(true)`,并配合Notification Manager(`mNM`)的`notify()`和`cancel()`方法。这种方式没有像新API那样直接将Notification显示与Service...
Android系统是全球最广泛使用的移动操作系统之一,由Google公司开发并维护。它的开源特性使得开发者可以深入理解其工作原理,并进行个性化定制。本篇将基于“Android系统总结+精通android”这一主题,全面探讨...
51. **KILL_BACKGROUND_PROCESSES**:应用可以结束其他应用的后台进程,释放系统资源。 52. **MODIFY_AUDIO_SETTINGS**:应用可以更改全局音频设置,如音量、输出设备等。 53. **MODIFY_PHONE_STATE**:应用可以...
如果当前空闲内存低于某一个阈值,就以对应的优先级等级为基准,遍历所有进程,寻找符合条件的进程进行释放操作。 ##### 3. 杀死进程的方式 LMK通过向目标进程发送不可忽略或阻塞的SIGKILL信号来强制终止进程。这...
- 碰撞检测:用于判断飞机、子弹和敌机之间的碰撞,决定游戏进程。 - 音效管理:播放各种音效,如射击、爆炸、背景音乐等。 - 存档和加载:保存玩家的进度,以便下次继续游戏。 3. C++编程技巧: 在Cocos2dx中...
3. 获取Android SDK,并通过SDK Manager更新到最新版本,同时安装对应的平台工具和API等级。 4. 安装GTK#,确保C#应用的图形界面在Linux环境下也能正常工作。 5. 安装MonoDevelop,用于辅助开发和调试。 6. 最后,...