【问题标题】:Is the static safe in Android?Android中的静态安全吗?
【发布时间】:2009-07-29 22:29:26
【问题描述】:

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

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

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

有什么建议吗?

【问题讨论】:

    标签: android static


    【解决方案1】:

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

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

    【讨论】:

    • Heikki,您对将静态变量放在应用程序上下文中有何看法?这样安全吗?
    • 这应该是安全的,但我看不出在一个对象中创建一个静态变量的意义,只要进程还活着。在应用程序上下文和应用程序对象本身中,一个普通的 var 就足够了。
    【解决方案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 方法,并且您的字段将保持不变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-14
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多