静态变量在活动之间交换数据真的很安全吗?

时间:2011-12-14 11:51:23

标签: android design-patterns

我正在开发一个由几项活动组成的应用程序:

  • 活动1:带有“开始”按钮的应用程序的主屏幕
  • 活动2:用户从列表中选择其身份(多个用户将使用该应用程序)
  • 活动3:用户输入密码
  • 活动4:用户从时间表中选择一个事件(每个用户都有自己的相关事件时间表)
  • 活动5:用户可以选择与活动相关的操作。
  • 活动6-10:用户执行适当的操作。

以下更多信息:

  • 来自6-10的每个活动都必须知道用户登录的内容以及已选择的活动
  • 6-10的每个活动都有一个允许用户返回活动的菜单:1(退出),4(选择不同的事件),5(选择不同的动作)

从现在开始,我一直在使用bundle来在活动之间交换数据,但随着操作数量的增加(某些操作使用3-4个活动从用户收集数据),它似乎使代码复杂化。将所有数据传递给每个创建的活动似乎都不太好。

我正在考虑将“用户名”和选定的“事件”存储为类的静态字段。我会非常简化代码,但是我不确定如果用户在某个时候说“主页按钮”并运行另一个需要大量内存的应用程序,这些数据是否会持续存在。

存储在静态字段中的数据是否安全?

7 个答案:

答案 0 :(得分:5)

最好有一个自定义的Application对象并将它们存储在那里。应用程序对象将与您的应用程序一样生效。

http://developer.android.com/reference/android/app/Application.html

您可以通过将getApplicationContext()强制转换为您的自定义应用程序类型来访问Application对象:

public class CustomApplication extends Application {
    private String userId;

    public void onCreate() {
        super.onCreate();
        ...
    }

    public String getUserId() {
        return userId;
    }

    ...
}

来自活动电话:((CustomApplication) getApplicationContext()).getUserId();

答案 1 :(得分:3)

没有。您不能保证这些都将存在于同一个类加载器中,在这种情况下,您将在不同的地方处理这些类的不同副本,而不是访问相同的共享状态。

现在可能正常工作;但不是我称之为“安全”的东西。

答案 2 :(得分:1)

您可以使用SharedPreference而不是使用静态变量/对象进入类。查看此博客http://android-er.blogspot.com/2011/01/example-of-using-sharedpreferencesedito.html

答案 3 :(得分:1)

您应该按照设计使用意图系统。静态和活动可能会被Android肆无忌惮地杀死。甚至Application类也可能被杀死。

假设您的应用程序包含两个活动,第一个活动允许用户在Application对象中存储一些数据。然后,用户单击按钮以启动显示数据的第二个活动。用户将手机放下并在几小时后回到手机上。

在此期间,Android可能会出于各种原因决定终止该应用。当用户回来时,拿起电话并重新启动应用程序将创建一个新的应用程序对象,第二个活动将被恢复,但用户输入的数据将不再在Application对象中可用,因为它是一个新的Application对象

帮助解决此问题的一种方法是即使对于复杂对象也使用SharedPreferences。 Gson完全能够将它们序列化和反序列化为SharedPreferences。

要模拟此操作,您可以执行以下操作:

$ adb shell ps | grep your.app.package

获取正在运行的应用的pid,然后

$ adb shell kill -9

然后使用任务切换器打开应用程序,您将有一个新的Application对象,但将进行第二个活动。

答案 4 :(得分:0)

静态字段有效但不优雅。你只需要一个单例模式后的会话对象。

答案 5 :(得分:0)

静态数据将在按下主页按钮时保持不变,再次打开应用程序时,您将转到您离开的相同状态,但是当您运行另一个需要大量内存的应用程序时,您可能会丢失所有静态数据。 但是如果你的静态数据非常少,那么它可能会持续存在。

您还可以查找SharedPreference。

答案 6 :(得分:-1)

您可以使用静态,除非您确定此静态变量不会与用户冲突。 静态变量也是类的属性,因此它消耗更多内存,因为生命周期是应用程序级别。 其他我可以建议使用非常方便的共享优惠。您可以通过应用程序的任何活动访问此共享首选项。所以不需要传递bundle并担心静态字段。 最后一个选项是我在您的应用程序中找不到的重要性是"使用数据库来存储和检索"。

希望这有帮助。