在Home压缩导致静态变量被破坏之前,系统是否有任何回调

时间:2013-05-28 05:07:04

标签: android

我在Activity

中有以下代码
// Cache object is holding other resources like thread handle, file handle.
// Explicit clean up is required when it is no longer used.
public static Cache cache = new Cache();

@Override
public void onPause() {
    super.onPause();

    if (this.isFinishing()) {
        cache.cleanUp();
    }
}

请注意,我需要进行isFinishing检查,因为有电话轮换,主页按下,启动新活动......也会触发onPause。因此,由于这种“简单”操作而拥有清理缓存会破坏具有Cache对象的目的。

但是,我的设计中可能会出现资源泄漏。

  1. 运行应用
  2. 按主页
  3. 运行其他内存密集型应用程序,按Home键,再次运行其他应用程序。
  4. 在某些时候,系统发现它应该删除我的应用程序,因为它已经很长时间没有被激活。因此,cache将变为空。 但是,我没有机会调用cache.cleanUp
  5. 长按主页按钮。我的应用程序仍应出现在列表中。
  6. 选择它。该活动将再次onCreate,并将再次创建第二个静态缓存实例。
  7. 在这种情况下,我们遇到资源泄漏,因为之前分配的旧线程处理第一个缓存对象拥有的文件句柄仍在系统中。我们无法处理它们,因为第一个缓存对象被系统破坏。

    我希望系统有一个回调,只要系统决定因为按下主页而销毁我的应用程序。通过这样的回调,我可以在我的静态对象被销毁之前执行必要的清理调用。

    我可以知道如何实现这一目标吗?

3 个答案:

答案 0 :(得分:1)

  

在这种情况下,我们正在进行资源泄漏,就像先前分配的一样   旧的线程句柄,第一个缓存对象拥有的文件句柄仍然是   在系统中

GC会照顾它。这就是你的应用程序被杀的原因。这样就可以清理这些内存并被其他应用程序使用。

答案 1 :(得分:0)

if(cache!=null) {
    cache.cleanUp();
}

你最好假设逻辑“我会这样做,只有当缓存不为空时。”

答案 2 :(得分:0)

主页按键没有回调方法。如果你想在Home键按下销毁你的应用程序,最好按后退键设置一个静态变量(onKeyUp和keycode == back_key)。和onPause方法,如果未设置该变量,则销毁该活动(finish();)。

长按主页按钮。我的应用程序仍然应该出现在list.On ::最近活动的列表中,它不依赖于杀死你的活动等......