Android应用程序OOM(Out Of Memory)调整进程的优先级

时间:2012-12-04 22:07:25

标签: android out-of-memory scheduler launcher

我正在开发一个Android Launcher(主屏幕替换)应用程序,并在低内存情况下运行到启动器中被杀死。当用户返回家中并且必须等待时,这显然不是很好。

在我的研究中,我发现Android将流程分为几个优先级组,从最高到最低:

系统

持久性

前景

可见

感性

服务

主页

B服务

背景

您可以通过执行以下命令来检查哪些进程:adb shell dumpsys meminfo

我在这个主题上找到的最全面的文档是:http://developer.android.com/guide/components/processes-and-threads.html#Lifecycle

但是,它没有清楚地说明上述所有群体。具体地,

  1. 过程如何/何时被视为“易感”?一些应用程序(例如Go Launcher EX)似乎已经找到了如何在不在前台时保持此类别。这样,它不会经常被杀死。他们是怎么做到的?

    我从adb shell dumpsys活动中发现Go Launcher Ex被视为前台服务。我可以在这个主题上找到的唯一文档说明你需要在状态栏中输入持久性通知。但是,Go Launcher Ex以某种方式解决了这个问题。我迷路了: - (

  2. “A服务”,“家庭”和“B服务”之间有什么区别?

  3. 启动器应用程序有关如何获得比常规应用程序更高优先级的任何其他一般建议?我认为这是一个完全合法的请求,因为启动器应该被认为比用户的大多数事情(当前前台活动除外)更优先。

2 个答案:

答案 0 :(得分:11)

回答问题1)和3)
如果您logcat -b events,您可以看到具有优先级可感知的应用程序确实会创建通知。但是所有属性(甚至是contentView)都设置为null 所以在我对相同问题的研究中,我只是尝试创建一个空的通知并用它启动我的服务:

startForeground(42, new Notification())

和voilà:logcat说:

I/notification_enqueue( 1607): [my.testapp.TestApp,42,NULL,Notification(pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x40 kind=[null])]

和dumpsys meminfo:

...
17539 kB: Perceptible  
     ...  
     6164 kB: my.testapp.TestApp (pid 25573)  
...

我不认为这是有意的,应该理解只有真正需要才能使用。我不想想象使用它的每一个糟糕的服务。

答案 1 :(得分:0)

根据您引用的文档,您可以尝试在Launcher中启动具有更高优先级的长期服务,并检查KILL次性能。