Java 当静态资源被杀死时,它们是全部被杀死了,还是在罕见的边缘情况下可以保留一些?

Java 当静态资源被杀死时,它们是全部被杀死了,还是在罕见的边缘情况下可以保留一些?,java,android,Java,Android,注意:虽然到目前为止(9月6日)提供的两个答案很有趣,但不幸的是,它们没有解决这个问题 我的一个Android测试设备是HTC One X。该设备以频繁杀戮后台应用程序(最令人恼火的是,甚至包括launcher)而闻名,因为它在RAM分配方面往往处于边缘,可能是由于HTC bloatware。然而,就我而言,这非常有用,因为它有助于突出各种低内存情况的影响,并允许我改进应用程序以应对此类事件。例如,我学到的一件事是,即使保留了活动backbackback,也可以杀死应用程序实例和其他静态资源。因

注意:虽然到目前为止(9月6日)提供的两个答案很有趣,但不幸的是,它们没有解决这个问题

我的一个Android测试设备是HTC One X。该设备以频繁杀戮后台应用程序(最令人恼火的是,甚至包括launcher)而闻名,因为它在RAM分配方面往往处于边缘,可能是由于HTC bloatware。然而,就我而言,这非常有用,因为它有助于突出各种低内存情况的影响,并允许我改进应用程序以应对此类事件。例如,我学到的一件事是,即使保留了
活动
backbackback,也可以杀死
应用程序
实例和其他
静态
资源。因此,为了提供良好的用户体验,即使运行应用程序的单个进程以及它所持有的所有
静态
s都消失了,backbackback仍然可以保持。由于这个原因,我的应用程序现在非常健壮,可以优雅地检查状态,并在必要时对恢复任何
活动时所需的“单例”数据进行重新初始化

转到我的具体问题,我看到了一个罕见的症状,通过代码检查,我认为这可能是由一个类的
静态
成员被杀死,然后重新初始化,而我的库类中的另一个静态资源没有重新初始化引起的。我理解两个独立的
静态
资源之间的这种依赖性代表了我的糟糕设计,我将进行重构以避免这种情况。然而,我想知道我的分析是否可能是正确的——也就是说,是否有可能存在这样一种情况,即在这种情况下,保留了backbackback,但只删除了一些
静态
资源,特别是在每个库/包的基础上

编辑1我将提供有关这两个类的更多信息

类1是一个我们称之为
Controller
的类。它不作为单例使用,但包含所有实例中通用的
静态
映射
。它的首字母是这样写的:

private static Map<String, String> sSomeMetaData;

static {
    sSomeMetaData = new HashMap<String, String>();
}
现在,这里是依赖关系。工厂类有一个getter方法来获取某个命名的图像对象,该对象是通过解析文件系统中的文件构建的。如果自工厂初始化以来没有要求工厂提供该图像,它将从文件中解析该图像(实际上是我的SVG图像解析器库)。图像被解析为
MyParserRender
对象。发生此图像解析时,工厂还将填充
控制器
类'
sSomeMetaData
成员中的一些数据。工厂保存的所有图像都保存在上面看到的
images
成员
TreeMap
中。因此,这些图像是
静态
单例工厂实例的非静态成员


罕见的问题情况似乎是,
Controller
的实例发现
ssomeetadata
为空,尽管我知道
MyFlyweightFactory
从其
映射中提供了一些对象。我相信,如果
MyFlyweightFactory
的存在一直存在,因此不需要重新解析图像对象(这意味着它将不再填充
sSomeMetaData
),这种情况肯定会发生,但与此同时,
Controller
static
初始值设定项再次执行。我可以确认
sSomeMetaData
未在代码中的任何其他位置
clear()
ed

你应该看看这个:

内存不足时,暂停的活动将被终止以释放内存

因此,为什么您应该尝试在您必须重新创建活动的每种情况下解释这一点

这不是一个完整的应用程序,而是基于活动的。因此,它将开始扼杀它认为不那么重要的活动。在同一个应用程序中,某些活动可能会受到影响,其他活动则不会受到影响

注意上表中的“Killable”列——对于那些标记为Killable的方法,在该方法返回承载活动的进程后,系统可能随时终止该进程,而不执行其另一行代码。因此,应该使用onPause()方法将任何持久数据(如用户编辑)写入存储。此外,在将活动置于此类后台状态之前,会调用onSaveInstanceState(Bundle)方法,允许您将活动中的任何动态实例状态保存到给定的Bundle中,以便在需要重新创建活动时在onCreate(Bundle)中接收。有关流程的生命周期如何与其承载的活动关联的更多信息,请参见流程生命周期部分。请注意,在onPause()而不是onSaveInstanceState(Bundle)中保存持久性数据非常重要,因为后者不是生命周期回调的一部分,因此不会在其文档中描述的每种情况下调用


我认为您在调试或跟踪应用程序中的问题时不知何故走错了方向

以下是我能告诉你的,我认为你理解错了:

当您的应用程序因需要资源而被Android销毁时,您的
应用程序
类也将被“销毁/停止”,而
backstack
将被保留。当您重新启动应用程序时,特定的
应用程序
类将被“重新创建”(
onCreate()
将被调用),您的
活动
后台堆栈也将被重新创建,这意味着用户可以看到的最后一个
活动
将被重新创建
private static MyFlyweightFactory instance = new MyFlyweightFactory();

public static synchronized MyFlyweightFactory getInstance(){
    return instance;
}   

private MyFlyweightFactory(){ }

TreeMap<String, MyParserRenderer> images = new TreeMap<String, MyParserRenderer>();