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

Android 静态变量在活动之间交换数据真的安全吗?,android,design-patterns,Android,Design Patterns,我正在开发一个包含两个活动的应用程序: 活动1:带有“开始”按钮的应用程序主屏幕 活动2:用户从列表中选择其身份(多个用户将使用该应用程序) 活动3:用户输入密码 活动4:用户从时间表中选择事件(每个用户都有自己的时间表和相关事件) 活动5:用户可以选择与活动连接的操作 活动6-10:用户执行适当的操作 以下是更多信息: 从6到10的每项活动都必须知道登录了哪些用户以及选择了哪些事件 从6到10的每个活动都有一个菜单,允许用户返回到活动:1(注销)、4(选择不同的事件)、5(选择不同的操作

我正在开发一个包含两个活动的应用程序:

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

  • 从6到10的每项活动都必须知道登录了哪些用户以及选择了哪些事件
  • 从6到10的每个活动都有一个菜单,允许用户返回到活动:1(注销)、4(选择不同的事件)、5(选择不同的操作)
从现在起,我一直在使用bundle在活动之间交换数据,但随着操作数量的增加,代码似乎变得复杂了(有些操作使用3-4个活动从用户收集数据)。将所有数据传递给每个创建的活动似乎并不好

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


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

您可以使用静态变量,除非您确定此静态变量不会与用户冲突。 静态变量也是类的属性,所以它会消耗更多的内存,因为生命周期是应用程序级别的。 我可以建议的另一个方法是使用非常方便的共享首选项。应用程序的任何活动都可以访问此共享首选项。所以不需要传递包,也不用担心静态场。 最后一个选项是“使用数据库存储和检索”,我不认为这在您的应用程序中很重要


希望这能有所帮助。

您可以使用SharedReference,而不是在类中使用静态变量/对象。查看此博客

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


它现在可能会起作用;但不,这不是我会称之为“安全”的东西。

静态字段工作但不优雅。您只需要一个遵循单例模式的会话对象。

最好有一个自定义应用程序对象并将它们存储在那里。应用程序对象将和你的应用程序一样长寿

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

public class CustomApplication extends Application {
    private String userId;

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

    public String getUserId() {
        return userId;
    }

    ...
}

从活动调用:
((CustomApplication)getApplicationContext()).getUserId()

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


您还可以查找SharedReference

您应该按照设计使用intent系统。静态和活动似乎可以被Android随意杀死。甚至应用程序类也可能被杀死

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

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

帮助实现这一点的一种方法是使用SharedReference,即使对于复杂对象也是如此。Gson完全能够将它们序列化和反序列化为共享引用

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

$adb shell ps | grep your.app.package

获取跑步应用程序的pid,然后

$adb炮弹杀伤-9


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

@Hasan Khan嘿,对不起,我实际上是在键入。我认为现在我的ans很好。试着在SharedReference中存储一个复杂的对象。SharedReference不是用来存储持久数据的吗?看看这篇文章,使用静态变量似乎是一个很好的解决方案,但是如果系统会杀死我的应用(例如,如果另一个应用需要内存),该怎么办?返回到我的应用程序后,我的应用程序是从头开始还是系统只是启动最新的活动?如果您也在持久化数据,我建议您在触摸任何代码之前正确创建应用程序的设计。当您将变量存储在类扩展应用程序中时如何?当另一个应用程序需要大量内存时,是否有可能丢失这些数据?您所说的“在同一个类加载器中”是什么意思?我认为整个应用程序只能使用该类的一个副本。不,两个不同的
活动
实例不能保证在同一个
类加载器
中。那他们就有两份了。另外,在一个
活动中
可能会随着时间的推移而改变:操作系统可以在
ondestory()
中自由卸载你的应用程序,并创建一个新的
类加载器
,然后重新加载。如果我将我的虚荣存储在