3

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

根据我自己的实验,在每个实例上都会调用 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..");
    }
}

任何人都可以在这里阐明我的问题吗?谢谢你。

4

2 回答 2

1

通过反复试验,我制定了一个适合任何感兴趣的人的解决方案。在操作系统回收内存的情况下,我已经缩小了应用程序状态恢复 (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    
    }
}
于 2012-07-27T04:56:24.330 回答
0

不知道对你有没有帮助

Android Activity类,

public void onLowMemory ()

这在整个系统内存不足时调用,并且希望主动运行的进程试图勒紧裤腰带。虽然没有定义调用它的确切时间,但通常它会在所有后台进程都被杀死的时候发生,即在到达我们希望避免杀死的托管服务和前台 UI 的进程终止点之前。

想要变得更好的应用程序可以实现此方法来释放它们可能持有的任何缓存或其他不必要的资源。从这个方法返回后,系统会为你执行一次 gc。

自:API 级别 14

public abstract void onTrimMemory (int level)

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

于 2012-07-24T06:10:46.493 回答