12

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

在我的研究中,我发现 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. 关于启动器应用程序如何获得比常规应用程序更高的优先级的任何其他一般建议?我认为这是一个完全合法的请求,因为对于用户来说,启动器应该被认为比大多数事情(当前前台活动除外)具有更高的优先级。

4

2 回答 2

11

回答问题 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)  
...

I don't think this is intended, and it should be understood that this should only be used if really really required. I don't want to imagine every lousy service using this.

于 2012-12-17T10:03:53.517 回答
0

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

于 2012-12-05T01:47:43.430 回答