安卓 - onDestroy 方法是否应该销毁活动、其变量并释放内存?

9
我在代码中发现了一个错误,这让我觉得自己并没有完全理解Android生命周期。是的,我已经阅读了所有文档并查看了所有图表,但它们似乎只谈到了何时保存数据,当活动失去焦点或被杀死时的情况。然而,我的问题是,如果我不需要保存状态,那么变量及其存储的值会发生什么?我原以为它们也会被销毁,但我的代码中的一个错误表明情况并非如此。
在我的情况下,我有一个活动,启动一个自定义视图(没有xml,我只是在自定义视图中绘制位图)。我当前在活动中唯一拥有的变量只是我的视图变量:GameView gameView;
现在,在我的视图中,我声明了几个位图、简单的int和float变量来处理绘画和触摸事件,并且我有一个包含小位图、每个对象坐标和其他一些东西的对象数组。在这个对象的类中的一个变量是一个静态变量,表示目前有多少个对象。我这样做是因为实例化对象会导致跟踪有多少个对象,而不是在对象类外跟踪。
我原以为静态变量在所有对象中都保持相同的值,但我也期望这个变量会随着Activity的视图被销毁时和所有其他变量和对象一起被销毁。然而,这似乎并没有发生。当这个活动再次启动时,这个静态变量仍然包含它上次运行的先前值 - 尽管已经调用了onDestroyed。
现在我的问题不是如何解决这个问题(我可以编写不同的代码来解决这个错误),而是我想理解为什么这个静态变量会出现这种情况,因为它不是全局的应用程序,它只存在于该活动的视图中?此外,这让我想到了该视图中的其余变量 - 它们是否被销毁并释放内存,或者至少它们的值在下一次调用该活动时不再可用,还是我需要自己处理这些 - 即使我不需要保存任何状态数据?
感谢您对此的任何见解。
1个回答

9

onDestroy是一个实例方法,它释放的内存(或允许垃圾回收器释放的内存)将属于相应的实例。活动不是单例的;可以有多个Activity的实例。

静态变量是类变量,可被该类的所有实例访问。它们在加载类时初始化,而不是在创建类的每个实例时初始化。

请参见了解实例和类成员以获取更多信息。摘录如下:

有时,您希望拥有对所有对象公共的变量。这可以通过使用static修饰符来实现。在其声明中具有static修饰符的字段称为静态字段或类变量。它们与类关联,而不是与任何对象关联。类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。任何对象都可以更改类变量的值,但也可以在不创建类的实例的情况下操作类变量。


谢谢,我知道静态变量在所有对象中是相同的内存位置,但我不知道“类变量也可以在不创建类实例的情况下被操作”。这就解释了为什么当对象被销毁时,这个值会一直存在。顺便说一句,当我说onDestroy时,我没有创建它或任何生命周期方法,除了onCreate - 但是当我按返回按钮时,希望与Activity实例相关联的所有数据都已被删除。但现在我明白为什么这个变量仍然存在了。谢谢。 - Alex
问题就在这里。静态变量不是与类的任何实例相关联的数据。 - hpique
如果我的Activity持有另一个类的对象引用(简单类而非Activity),并且是实例成员,那么onDestroy()方法会自动清除它吗?还是我需要显式地将其清空(设置为null)? - Akoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接