为什么没有启动应用程序时可用内存会有所变

时间:2013-05-14 04:22:36

标签: android memory-management

我有一个Android应用程序,我们可以从中启动其他已安装的应用程序。这有一个后台服务,它在运行我的应用程序时始终执行。当在某些设备上进行测试时发现服务因内存不足而停止,同时启动一些应用程序,如相机,画廊(专辑)等...所以我试过

private boolean isRunningOutOfMemory(){
    MemoryInfo memoryInfo = new MemoryInfo();
    ActivityManager activityManager = (ActivityManager)getSystemService(Service.ACTIVITY_SERVICE);
    activityManager.getMemoryInfo(memoryInfo);
    final long appMemeory = Runtime.getRuntime().totalMemory();
    final long availableMemory = memoryInfo.availMem / 1048576L;
    final long memoryThreshold = ((memoryInfo.threshold * 2) + appMemeory) / 1048576L;
    return (availableMemory <= memoryThreshold);
}

如果条件为真,则显示一个对话框。此方法始终在后台运行。这种情况有时无法成功运行。如果可用内存大于阈值的两倍,服务就会停止。

当没有启动其他应用程序(从我的应用程序启动应用程序)时,此可用内存会有所不同。例如,正在运行的应用程序是我的。

可用内存变化的原因是什么?

是否可以找到服务停止的内存?

我如何有效地处理这种情况?

先谢谢

1 个答案:

答案 0 :(得分:0)

Android系统只要决定需要更多内存,就可以终止任何进程。您可以添加提示(例如标记服务“前景”),但系统可以随时将其删除。

您的后台服务不是唯一运行的后台服务。最有可能的是,许多其他应用程序设置服务以按计划的时间间隔运行(希望使用Android Alarms而不是wait()循环...)来获取新数据。其他应用程序可能会设置广播接收器,这些广播接收器在系统或Google Cloud Messaging发送意图时进行实例化和执行。

这是非常有活力的。您的服务(和整个应用程序)需要准备好随时停止。将其标记为“前景”会增加其优先级,但只有在服务与用户已启动的内容相关时才应执行此操作,例如播放歌曲或下载文件。

还有一件事 - 永远不要从服务中显示对话框!这对用户来说非常不利,因为它可能在他们使用任何其他应用程序时发生。如果您需要告知用户服务中发生的事情,请发送通知。