Android 在按下Home键导致静态变量被破坏之前,系统是否有任何回调

Android 在按下Home键导致静态变量被破坏之前,系统是否有任何回调,android,Android,我在活动 // 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 (thi

我在
活动

// 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();
    }
}
请注意,我需要进行
正在完成
检查,如进行电话轮换、家庭按键、启动新活动。。。也将触发暂停。因此,由于这种“简单”的操作而拥有清理缓存,无法实现拥有缓存对象的目的

然而,在我的设计中存在资源泄漏的可能性

  • 运行应用程序
  • 回家
  • 运行其他内存密集型应用程序,按Home键,然后再次运行其他应用程序
  • 在某个时刻,系统发现它应该删除我的应用程序,因为它已经有一段时间没有激活了。因此,
    缓存
    将变为空但是,我没有机会调用cache.cleanUp
  • 长按主页按钮。我的应用程序仍应显示在列表中
  • 选择它。该活动将再次创建,并且将再次创建静态缓存的第二个实例
  • 在这种情况下,我们存在资源泄漏,因为先前分配的旧线程句柄(第一个缓存对象拥有的文件句柄)仍在系统中。我们无法处理和定位它们,因为第一个缓存对象被系统破坏

    我希望有一个由系统回调,每当系统决定销毁我的应用程序,由于主页按下。有了这样的回调,我可以在静态对象被销毁之前对它们执行必要的清理调用

    我可以知道我怎样才能做到这一点吗

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

    最好假设逻辑为“我将执行此操作,并且只有在缓存不为空时才执行此操作”

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

    长按主页按钮。我的应用程序仍应出现在列表中。On::最近活动的列表不取决于终止您的活动等

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


    GC会处理的。这就是你的应用程序被终止的原因。因此,这些内存将被清理并被其他应用程序使用。

    缓存在应用程序代码范围内永远不会为空,这不是问题中描述的当前问题。这些是线程句柄和文件句柄。您需要显式停止线程,并显式关闭文件。GC只负责内存。要添加,如果父引用(缓存)变为null,则子引用将变得不可访问,并在以后进行垃圾收集。@CheokYanCheng如果应用程序被销毁,则其拥有的所有句柄和线程也将被释放。总司令会在某个时候拿到的,我很困惑。你是说你的应用程序被破坏了还是你的活动被破坏了?如果应用程序被销毁,那么就不会有泄漏(除非GC中有bug,但这适用于所有应用程序)。如果活动已销毁,则必须调用onPause(),因为只有当活动不在前台时,活动才会被销毁。我不明白你的问题。