由于RAM较低,检测OS是否退出应用程序

时间:2012-07-24 05:45:43

标签: android memory-management

在我正在构建的应用程序中,我需要检测应用程序退出当且仅当应用程序在后台退出时因为操作系统正在回收内存而退出。

从我自己的实验中,在每个实例上调用onDestroy。我已经尝试检查isFinishing但是我不能100%确定将它隔离的情况。

@Override
public void onDestroy()
{
    super.onDestroy();
    Log.i("V LIFECYCLE", "onDestroy");
    if (!isFinishing())
    {
        // are we here because the OS shut it down because of low memory?
        ApplicationPreferences pref = new ApplicationPreferences(this);
        // set persistant flag so we know next time that the user
        // initiated the kill either by a direct kill or device restart.
        pref.setThePersistantFlag(true);
        Log.i("DEBUG", "onDestroy - ensuring that the next launch will result in a log out..");
    }
}

有人能解释我的问题吗?三江源。

2 个答案:

答案 0 :(得分:1)

通过反复试验,我找到了一个适合所有感兴趣的人的解决方案。在OS回收内存的情况下,我正在恢复应用程序状态(onResume)时缩小了大小。

public boolean wasJustCollectedByTheOS = false; 

@Override
public void onSaveInstanceState(Bundle savedInstanceState)
{
    super.onSaveInstanceState(savedInstanceState);
    // this flag will only be present as long as the task isn't physically killed
    // and/or the phone is not restarted.
    savedInstanceState.putLong("semiPersistantFlag", 2L);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    long semiPersistantFlag = savedInstanceState.getLong("semiPersistantFlag");
    if (semiPersistantFlag == 2L)
    {
        savedInstanceState.putLong("semiPersistantFlag", 0L);
        this.wasJustCollectedByTheOS = true;   
    }
}

// this gets called immediately after onRestoreInstanceState
@Override
public void onResume() {
    if (this.wasJustCollectedByTheOS){
        this.wasJustCollectedByTheOS = false;
        // here is the case when the resume is after an OS memory collection    
    }
}

答案 1 :(得分:0)

我不知道它是否有帮助,

来自Android Activity班,

public void onLowMemory ()

当整个系统内存不足时,调用此方法,并希望主动运行过程以试图收紧腰带。虽然没有定义调用它的确切位置,但通常它会在所有后台进程被杀死的时候发生,也就是在到达主机服务和前台UI的杀死进程之前,我们希望避免被杀死。

想要好的应用程序可以实现此方法来释放他们可能持有的任何缓存或其他不必要的资源。从此方法返回后,系统将为您执行gc。

自:API等级14

public abstract void onTrimMemory (int level)

当操作系统确定正是进程从其进程中删除不需要的内存的好时机时调用。例如,当它进入后台并且没有足够的内存来保持尽可能多的后台进程运行时,就会发生这种情况。您永远不应该与级别的确切值进行比较,因为可能会添加新的中间值 - 您通常希望比较该值是否大于或等于您感兴趣的级别。