Android 切换到摄影机意图时应用程序类数据被置零

Android 切换到摄影机意图时应用程序类数据被置零,android,Android,我正在开发一个应用程序,它使用一个自定义类和其他自定义类作为成员。即: public class TopClass { public OtherClass1 otherClass1; public OtherClass2 otherClass2; } 这些数据需要提供给其他一些活动。我一直将其存储在应用程序的主要活动中,并能够引用它 除了在Droid X2上运行外,一切都很好。在该设备上,它将正常运行,直到调用外部意图为止。切换到相机、地图或日历时也会发生同样的情况:使用后退按

我正在开发一个应用程序,它使用一个自定义类和其他自定义类作为成员。即:

public class TopClass {
    public OtherClass1 otherClass1;
    public OtherClass2 otherClass2;
}
这些数据需要提供给其他一些活动。我一直将其存储在应用程序的主要活动中,并能够引用它

除了在Droid X2上运行外,一切都很好。在该设备上,它将正常运行,直到调用外部意图为止。切换到相机、地图或日历时也会发生同样的情况:使用后退按钮或“确定”按钮返回应用程序后,应用程序将使用NPE引用“TopClass”

以下是供参考的摄像头调用示例:

public void startCamera(int pos) {
    Log.v(App.DEBUG_TAG, "startCamera(slot "+pos+")");

    Intent i = new Intent("android.media.action.IMAGE_CAPTURE");
    i.putExtra(MediaStore.EXTRA_OUTPUT, getFilesDir().getAbsolutePath());
    i.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivityForResult(i, pos);
}
我转而使用应用程序类来存储“TopCLass”,但没有改变

使用ACRA获取堆栈跟踪和logcat,在这里我开始记录活动中的每个生命周期事件,我可以看到“TopClass”在返回活动时为null。上一个活动的所有局部变量仍然以不变的状态存在,只是“全局”数据被取消了-我猜是GC

我不能在我的设备(Droid难以置信地运行CM7[2.3.7])或任何模拟器上复制它,即使是X2插件,也不能在我妻子的Droid X上复制

我正在尝试一个实验,将“全局”的“TopClass”复制到一个局部的“TopClass”变量,但还没有听说这是否有效

我的问题是:

  • 保存此数据的正确方法或推荐方法是什么?从我的阅读中,我了解到它是使用一个应用程序类实例,但这不起作用

  • 你知道为什么X2在调用外部意图时会清空应用程序拥有的类吗

  • 保存此数据的正确方法或推荐方法是什么

    您可以将数据持久化到文件中。这是一个数据库,
    SharedReferences
    ,还是一个您自己设计的文件,取决于您

    你知道为什么X2在调用外部意图时会清空应用程序拥有的类吗

    最有可能的是,它不是“清空应用程序拥有的类”。相反,您的进程正在被终止。无论您何时不在前台,您的进程都可能会被终止,以便为其他进程释放内存,无论您是否因为启动了第三方活动而不在前台,或者用户按下HOME键,或者用户调出最近的任务列表并导航到另一个任务,或者用户收到电话等等。X2可能比其他设备更积极地消除后台进程,无论是通过设计还是作为摩托罗拉做出的其他决定的副作用

    保存此数据的正确方法或推荐方法是什么

    您可以将数据持久化到文件中。这是一个数据库,
    SharedReferences
    ,还是一个您自己设计的文件,取决于您

    你知道为什么X2在调用外部意图时会清空应用程序拥有的类吗


    最有可能的是,它不是“清空应用程序拥有的类”。相反,您的进程正在被终止。无论您何时不在前台,您的进程都可能会被终止,以便为其他进程释放内存,无论您是否因为启动了第三方活动而不在前台,或者用户按下HOME键,或者用户调出最近的任务列表并导航到另一个任务,或者用户收到电话等等。X2可能比其他设备更积极地消除后台进程,无论是通过设计还是作为摩托罗拉做出的其他决定的副作用。

    我感谢您的帮助!我听到有点俚语说“作废”——意思是“作废”。让我大吃一惊的是,应用程序类被终止,与之相关的所有数据都丢失了。然而,调用外部意图的活动并没有丢失。此活动启动时将发送一个包含自定义类的捆绑包。当返回时,该自定义类在活动中仍然是可行的。@RedBinary:我不知道您是如何向活动“发送捆绑包”的。如果您指的是与
    startActivity()
    一起使用的
    Intent
    上的额外功能,那么如果需要,相同的
    Intent
    将用于重新创建活动(例如,安卓终止了您的流程,但用户返回到相关活动,现在需要从头开始重新创建活动)1.对不起,我说不清楚。对我声明了一个意图,我声明了一个捆绑。我使用Bundle的putSerializable()方法来包含自定义类。然后,我使用Intent的putExtras()方法包含具有序列化自定义类的Bundle。然后我以startActivity(意向)开始相关活动。我只是认为“此活动在启动时发送一个包含自定义类的包”就足够了。抱歉,不过你明白我的意思了。感谢您的解释-这确实帮助我澄清了一些问题。现在我想到,由于所提到的意图(包括捆绑包)具有足够的持久性,可以用于“在需要时重新创建活动”,并且“TopClass”是可序列化的,您是否建议不要在这种情况下使用相同的方法来持久化它?如果是,为什么?我感谢你的帮助!我听到有点俚语说“作废”——意思是“作废”。让我大吃一惊的是,应用程序类被终止,与之相关的所有数据都丢失了。然而,调用外部意图的活动并没有丢失。此活动启动时将发送一个包含自定义类的捆绑包。当返回时,该自定义类在活动中仍然是可行的。@RedBinary:我不知道您是如何向活动“发送捆绑包”的。如果您是指与
    startActivity()一起使用的
    Intent
    上的额外功能