2012-04-02 82 views
7

在我的应用程序中,我有Loginactivity。它有一个静态变量用户名,它将被分配给用户输入用户名的值。登录活动启动活动A和A启动B.在A中,使用变量Loginactivity.username。android应用程序崩溃时的静态变量行为

现在由于B中的一些错误,应用程序崩溃。当我按下强制关闭时,应用程序重新启动并且活动A是当前活动。在活动A中,我使用了一个静态变量Loginactivity.username。我看到在崩溃之后,这个变量的初始值是空的字符串“”;

为什么会发生这种情况?你能解释这种行为吗?那么当应用程序崩溃时,堆栈中的所有活动都会重新启动?我看到Loginactivity的创建没有被调用。那么静态变量值如何改变?

回答

11

是,当一个应用程序崩溃,重新启动该应用程序的JVM,你的类将被重新装载,你失去所有的静态变量和实例变量。

解决方法是删除崩溃原因。 :)

+0

我固定的崩溃,但希望知道行为。谢谢 。 – png 2012-04-02 06:04:28

+3

这是一个很好的问题,但没有真正提到的Android文档。 – Snicolas 2012-04-02 06:05:59

+0

如果合适,请接受答案。 – Snicolas 2012-04-02 06:39:15

1

这是因为您在LoginActivity中保留此静态成员导致内存泄漏。

我会考虑将此变量保存在应用程序范围(自定义应用程序类)中或将其保存到数据库中。

无论如何,只要记住在应用程序完成时取消该变量。

2

使用SharedPreferences代替,或在应用类信息存储

3

当你的活动B崩溃您的应用程序在运行Android的Dalvik虚拟机(每个应用程序都有其自己的DVM它们是两个不同的过程)被杀害。当你启动Activity A时,用户名是“”,因为默认情况下,Java为字符串设置所有实例变量(如果你喜欢的类变量或字段)为null(引用),0(基元)和“”。所以你的活动A正常工作。你只需要可以存储用户名的共享偏好,数据库,或触发用户再次登录时......我还要修复活动B ...哈哈

+0

我在这里有一个疑问:如果应用程序重新启动,它如何获得以前的活动堆栈。我的应用程序,无论何时在Loginactivity重新启动,我从sharedpref读取用户名。她看到Loginactivity没有得到恢复,启动了堆栈顶部的instaed activity A.在A中,我将变量设置为Loginactivity.username,并且此活动被重置,但活动未恢复! – png 2012-04-02 06:57:28

+0

也许您的共享首选项无法正常工作。你的堆栈被VM杀死了。或者你的逻辑绕过登录活动有一个小故障。资源? – jjNford 2012-04-02 07:01:31