Android应用程序OOM(内存不足)调整进程的优先级



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

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

系统

持久

前景

可见

可感知

A服务

主页

以前的

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服务"、"家庭服务"one_answers"B服务"之间有什么区别?

  3. 对于启动器应用程序,关于它如何获得比普通应用程序更高的优先级,还有什么其他的一般建议吗?我认为这是一个完全合法的请求,因为对于用户来说,启动器应该被视为比大多数事情(除了当前的前台活动)更高的优先级。

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

startForeground(42, new Notification())

瞧: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)  
...

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

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

最新更新