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

Android应用程序OOM(内存不足)进程的调整优先级,android,out-of-memory,scheduler,launcher,Android,Out Of Memory,Scheduler,Launcher,我正在开发一个Android Launcher(主屏幕替换)应用程序,并在内存不足的情况下撞上了Launcher。当用户返回家中并且必须等待时,这显然不是很好 在我的研究中,我发现Android将流程划分为几个优先级组,从最高到最低: 系统 持久的 前景 可见的 可察觉 A服务 家 先前的 B服务 背景 您可以通过执行:adb shell dumpsys meminfo来检查哪些进程属于哪个进程 关于这个主题,我能找到的最全面的文档是: 然而,它并没有清楚地描述上述所有群体。具体来说, 过程如何

我正在开发一个Android Launcher(主屏幕替换)应用程序,并在内存不足的情况下撞上了Launcher。当用户返回家中并且必须等待时,这显然不是很好

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

系统

持久的

前景

可见的

可察觉

A服务

先前的

B服务

背景

您可以通过执行:adb shell dumpsys meminfo来检查哪些进程属于哪个进程

关于这个主题,我能找到的最全面的文档是:

然而,它并没有清楚地描述上述所有群体。具体来说,

  • 过程如何/何时被视为“可感知”?一些应用程序(如)似乎已经解决了如何在不在前台的情况下保持这一类别。这样,它就不会经常被杀死。他们是怎么做到的

    我从adb shell dumpsys活动中发现,Go Launcher Ex被视为前台服务。我能找到的关于这个主题的唯一文档说,您需要在状态栏中放置一个持久通知。然而,Go Launcher Ex不知何故绕过了这一要求。我不知道该怎么做:(

  • “A服务”、“家庭服务”和“B服务”之间有什么区别

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


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

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

    startForeground(42,新通知())

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

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

    问得好!为dumpsys添加1。感谢您的回答!我刚刚确认了所有的事情,这真是太神奇了……我现在有点想隐藏这个答案,因为我担心每一个糟糕的应用程序都会试图使用它,并完全绕过Android的内存管理:-)我使用的是startForeground(0,notify)和startForeground(1,notify)对我来说都很有效,感谢您提出了找出代码中错误的想法。我从没想过将通知id设置为1或42会改变这么多事情