我正在创建事件搜索应用程序,我们从一个屏幕设置搜索条件并填充到另一个屏幕中,然后用户可以从第三个屏幕编辑搜索条件并转到第四个屏幕。

为了实现上述任务,我使用静态对象来记住应用程序周围的值,并且我不需要做任何额外的事情。

但我担心如果Android中的静态对象生命周期内存不足发现Android删除静态对象???

由于android支持多任务,如果用户切换到另一个应用程序,并且当用户返回应用程序时开始表现疯狂,静态对象在多任务时是否会被删除???任何想法 ??还建议通过单例方法保存静态对象是更好的方法???

有帮助吗?

解决方案

让我们从一些背景开始:当您启动应用程序时会发生什么?
操作系统启动一个进程,为其分配唯一的进程id,并分配一个进程表。一个进程启动一个DVM(Dalvik VM)的实例;每个应用程序都在 DVM 内运行。
DVM 管理类加载卸载、实例生命周期、GC 等。

静态变量的生命周期:静态变量在 JVM 加载类时产生,并在类卸载时消亡。

因此,如果您创建一个 Android 应用程序并初始化一个静态变量,它将保留在 JVM 中,直到发生以下情况之一:
1.该类已卸载
2.JVM 关闭
3.进程死亡

请注意,当您切换到另一个应用程序的不同活动并且上述三种情况都不会发生时,静态变量的值将保留。如果发生上述三种情况中的任何一种,静电就会失去其价值。

您可以使用几行代码来测试它:

  1. 在活动的 onCreate 中打印未初始化的静态 -> 应该打印 null
  2. 初始化静态。打印它 -> 值将不为空
  3. 点击后退按钮并转到主屏幕。笔记:主屏幕是另一项活动。
  4. 再次启动您的活动 -> 静态变量将不为空
  5. 从 DDMS 终止您的应用程序进程(设备窗口中的停止按钮)。
  6. 重新启动您的活动 - >静态将具有空值。

希望有帮助。

其他提示

嗯,单例模式也是基于使用静态变量,所以实际上你会处于相同的位置。虽然静态方法在大多数情况下可能有效,但在某些情况下,当内存已满并且另一个活动在应用程序移动到下一个屏幕之前占据前台时,您的活动的进程可能会被终止,并且您会丢失静态值。然而,Android 提供了一些在状态之间保存值或传输它们的选项,例如:

  • 使用意图,您可以将搜索标准从活动传递到活动(类似于Web HTTP请求)
  • 使用应用程序首选项,您可以保存值并在需要它们的活动中检索它们
  • 使用SQLite数据库,您可以将它们持续到表格中,然后再检索
  • 如果您需要仅保存活动状态,以便在重新启动时,这些字段会被其先前选择的值填充,则可以实现OnSaveInstanceState()活动方法 - 请注意,不建议在各个状态的活动之间进行持续存在。

您可以通过查看以下内容获得一些有关首选项、意图和 sqlite 数据库的使用的代码示例 aegis-shield源代码树 在谷歌代码或其他开源 Android 应用程序中。

经过一番研究,事实证明,使用应用程序存储单身并没有很大的想法,除非你准备创建它:

不要数据存储在应用对象

因此,虽然接受的答案是技术上正确,但它不提供所有的信息。

由于上面的链接提示,如果你真的想坚持这种模式,你需要准备,如果可能的检查null并重新创建数据。

@ r1k0就在这里。整个申请过程中杀死并重新启动一类的静态字段中存储的数据将不会在自己的坚持。常规的Android杀死处理(正在运行的应用)时,它需要的内存。

每Android的DOC:活动状态和喷射从存储器

  

在系统从不直接杀死的活性。相反,它杀死   该活动运行,破坏不仅是活动过程   但一切在运行的过程中,以及

可以保存和恢复的图元的状态,以及使用下面的方法可序列化和Parcelable对象。这些在正常活动的生命周期中自动调用。

protected void onSaveInstanceState(Bundle state) {}
protected void onRestoreInstanceState(Bundle savedInstanceState){}

所以,如果你有一个只有静态变量的一类,可以节省每个字段的onSaveInstanceState中()状态,并在onRestoreInstanceState恢复它们()。当的Android杀死你的应用程序正在运行的过程中,你的变量的状态将被保存,并且当恢复的Android应用程式,该值将在存储器中被恢复在相同的状态前。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top