1.Activity
场景 | 进程优先级 | oom_adj值 |
---|---|---|
已调用Activity.onResume()方法 | 前台进程 | 0 |
已调用Activity.onPause()方法,例如,Activity上启动了一个对话框 | 可见进程 | 100 |
已调用Activity.onStop()方法 | 后台进程 | 一般大于900 |
2.Broadcast Receiver
场景 | 进程优先级 | oom_adj值 |
---|---|---|
执行onReceive() 时 | 前台进程 | 0 |
退出onReceive() 时 | 应用其他的状态决定 |
3.Services
场景 | 进程优先级 | oom_adj值 |
---|---|---|
在执行onCreate()、onStartCommand() 时 | 前台进程 | 0 |
Service 刚运行时 | Service A | 500 |
若系统同时运行的Service 过多,较早运行的Service 会放到Service B | Service B | 800 |
运行超过30分钟、或曾经启动过activity | 后台进程 | 一般大于900 |
Bind service情况:
(1)若进程A bind 住进程B 的service,ActivityManager会将B的重要性提升至与A 相同。如果A使用完服务后,忘了调用unbindService(),B的重要性就降不下来,极端情况是,若A是常驻的,会导致B也变成常驻了,引发系统性内存问题.
(2)若进程A bind住的service位在同一进程,则OOM_ADJ 不会因此有任何改变
4.Content Provider
(1)若进程A查询进程B的provider得到Cursor,在进程A关闭Cursor之前,ActivityManager会保持provider connection,此时B的OOM_ADJ将提升至与A相同。若进程A属于常驻应用,则B也跟着变成常驻了,就形成严重的内存问题
(2)若应用B的UID为system UID,不可开放content provider给其他应用使用。在安卓的特殊机制中,只要进程A存取(insert/update/delete/pquery) 了B的provider,provider connection 就不再结束。