Android静态对象生命力

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

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

但我担心如果关于静态对象生命周期在android如果低内存发现android删除静态对象???

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

4个解决方案
230 votes

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

静态变量的生命周期:一个静态变量在JVM加载一个类时就存在,并在卸载该类时死掉。

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

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

您可以使用以下几行代码对此进行测试:

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

希望有所帮助。

Samuh answered 2019-08-13T03:21:01Z
16 votes

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

  • 使用Intent,你可以传递你的搜索条件从活动到活动(类似于网络http请求)
  • 使用应用程序首选项,您可以保存值并检索他们在需要他们的活动中
  • 使用sqlite数据库就可以了将它们保存在表格中并检索他们以后
  • 如果你只需要保存活动状态,以便重新启动时,字段充满了他们以前的选中的值,你可以实现onSaveInstanceState()活动方法 - 请注意,这不是推荐用于活动之间持久的国家。

通过查看谷歌代码或其他开源Android应用程序中的aegis-shield源代码树,您可以获得偏好,意图和sqlite数据库使用的一些代码示例。

r1k0 answered 2019-08-13T03:22:04Z
6 votes

经过一些研究后发现,使用Application来存储单例并不是一个好主意,除非你准备重新创建它:

不要将数据存储在应用程序对象中

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

如上面的链接所示,如果您真的想坚持使用该模型,则需要准备好检查null并重新创建数据(如果可能)。

Rick77 answered 2019-08-13T03:22:50Z
3 votes

@ r1k0就在这里。 将数据存储在类的静态字段中将不会在应用程序进程终止和重新启动时自行保留。 Android在需要内存时会定期杀死进程(运行应用程序)。

根据Android doc:活动状态和从内存中弹出,

系统永远不会直接杀死活动。 相反,它杀死了   活动运行的过程,不仅破坏活动   但是其他一切都在这个过程中运行。

您可以使用以下方法保存和恢复基元的状态以及Serializable和Parcelable对象。 这些在正常活动生命周期中自动调用。

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

因此,如果您的类只有静态变量,则可以在onSaveInstanceState()中保存每个字段的状态,并在onRestoreInstanceState()中恢复它们。 当Android终止运行您的应用程序的过程时,将保存变量的状态,并且当Android恢复您的应用程序时,这些值将在内存中以与以前相同的状态恢复。

eric.mcgregor answered 2019-08-13T03:23:44Z
translate from https://stackoverflow.com:/questions/1944369/android-static-object-lifecycle