Android 中的静电安全吗?

Is the static safe in Android?

提问人:Bostone 提问时间:7/30/2009 更新时间:1/7/2013 访问量:3985

问:

我在代码中使用了一个静态类,该类定义了一个静态字段,我在 Activity onStop/onStart 调用之间重用该字段。下面是一个场景:

  1. 用户点击“授权”按钮(静态数据初始化)
  2. 活动已停止并调用 Web 浏览器
  3. 浏览器执行回调并恢复 Activity(重用静态数据)

至少有一个用户报告了步骤 3 的失败,我无法重现,但看起来像是静态数据的重置

有什么建议吗?

Android 静态

评论


答:

10赞 Heikki Toivonen 7/30/2009 #1

这是不安全的。您的进程可以在 onStop 和 onStart 之间终止,因此所有静态数据都将消失。事实上,您的活动甚至可以在到达 onStop 之前被杀死。在您的测试中,该进程没有被终止,但它是针对用户的。请参阅 Android 活动生命周期,其中有一个很好的流程图,显示了各种可能性。

您需要以其他方式存储数据,例如在 prefs 或数据库中。

评论

1赞 Guido 8/23/2010
Heikki,您如何看待将静态 var 放在应用程序上下文中?这样安全吗?
1赞 Heikki Toivonen 8/24/2010
这应该是安全的,但我不认为在只要进程还活着就存在的对象中制作静态变量有什么意义。在应用程序上下文和应用程序对象本身中,一个普通的 var 应该就足够了。
0赞 Mark 1/7/2013 #2

如果此静态数据与您刚刚停止的活动相关 - 您可以使用普通的非静态字段 + onSaveInstanceState 方法。

@Override
protected void onSaveInstanceState(Bundle outState) {
    // ... save your Serializable data here in outState bundle
    super.onSaveInstanceState(outState);
}

具体情况如下:

  1. 您关闭您的活动并转到浏览器(调用 onStop)
  2. 系统终止您的应用程序进程(onSaveInstanceState 被调用 保存数据的位置)
  3. 用户导航回您的活动(onCreate 使用 savedInstanceState 参数)

在大多数情况下,不会出现第二点。系统可以但不必终止您的应用进程。如果没有 - 您将不会获得 onCreate 方法,而是 onStart 和 onResume 方法,并且您的字段将保持不变。