如果Android需要更多内存,它可以决定抛出什么?

时间:2014-03-04 14:26:54

标签: android android-activity android-service

我们正在开发一个需要前台服务来收集数据的应用。我试图了解Android如何处理流程及其活动,如果它绑定到前台服务。

如果Android需要更多内存,它可以决定抛弃什么?整个过程还是只是活动?预期的行为是什么?

跟进问题:我们应该听取哪些事件,以确保在发生这种情况时我们会发出信号? Activity.onDestroy?是否保证被解雇?

3 个答案:

答案 0 :(得分:2)

如果需要内存,Android确实会终止整个过程。

活动被释放,并在被销毁后成为垃圾收集的候选者,从而释放过程中的空间。在您的过程中释放空间不会影响Android可用的内存。

Activity.onDestroy称为尽力而为。可以在不调用onDestroy方法的情况下销毁Activity。 onPause是有保证的。

Android为每个进程分配一个优先级,一个介于-15和16之间的数字,称为oom_adj。数字越大,杀死进程的可能性就越大。只有系统应用程序才有oom_adj< 0.当前可见的应用程序的oom_adj为0.没有UI的进程,但正在运行的服务将在4-5区域。一个不可见且没有正在运行的服务的进程将具有更高的oom_adj,并且不在后栈中的进程将具有最高值。

每个设备都有一个编译表,是Android系统的一部分,它将oom_adj值与低内存条件相关联。例如,该表说,如果Android降至最后8 M的内存,它应该使用oom_adj(例如12或更高)杀死任何进程。随着内存情况变得更加严峻,允许Android杀死oom_adj越来越低的进程。

当Android杀死你的进程时,因为它需要内存,所以使用相当于kill -9的方式。

答案 1 :(得分:1)

  

整个过程还是只是活动?

Android终止进程。 可以自己摆脱活动(例如,调用finish()),当它们被垃圾收集时,Android可以将一些堆空间返回给系统。但是,Android不会以这种方式主动摆脱单个组件 - 这是整个过程,或者什么也不做。

  

跟进问题:我们应该听取哪些事件,确保在发生这种情况时发出信号?

当您的流程终止时,不会调用任何内容。

答案 2 :(得分:0)

如果系统认为使用过多内存,托管Android组件的进程将被终止。

但是,由于您正在使用前台服务,因此在内存资源极低之前,Android会尽力不杀死您的进程。对于您的活动,您应覆盖onSavedInstanceState以保存您的数据,以防您的活动在此方案中被杀死。

此外,为了让您的进程被系统杀死以回收资源,您应该尽可能减少内存占用。您可以在两个进程中分离服务和活动组件,因为活动及其UI资源通常比服务占用大量内存。通过在单独的进程中托管活动组件可以保护您的服务免受杀死以及活动。