首页 文章

Android静态对象生命周期

提问于
浏览
94

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

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

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

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

4 回答

  • 4

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

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

    因此,如果您创建一个Android应用程序并初始化一个静态变量,它将保留在JVM中,直到发生以下情况之一:

    1. class 卸载
    2. JVM关闭
      3.过程终止

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

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

    • 在活动的onCreate中打印未初始化的静态 - >应该打印为null

    • 初始化静态 . 打印它 - >值将为非null

    • 点击后退按钮,进入主屏幕 . 注意:主屏幕是另一项活动 .

    • 再次启动您的活动 - >静态变量将为非null

    • 从DDMS(设备窗口中的停止按钮)中终止您的申请流程 .

    • 重新启动您的活动 - >静态将具有空值 .

    希望有所帮助 .

  • 16

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

    • 使用Intent,您可以将搜索条件从活动传递到活动(类似于Web http请求)

    • 使用应用程序首选项,您可以保存值并在需要它们的活动中检索它们

    • 使用sqlite数据库,您可以将它们保存在表中并稍后检索它们

    • 如果您只需要保存活动状态,以便在重新启动时,字段将填充其先前选择的值,您可以实现onSaveInstanceState()活动方法 - 请注意,不建议在状态持久性活动之间使用 .

    您可以通过查看Google代码或其他开源Android应用程序中的aegis-shield source code tree来获取偏好,意图和sqlite数据库使用的一些代码示例 .

  • 228

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

    Don't store data in the application object

    所以虽然the accepted answer在技术上是正确的,但它并不提供所有信息 .

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

  • 3

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

    根据Android doc:Activity state and ejection from memory

    系统永远不会直接杀死活动 . 相反,它会杀死活动运行的过程,不仅会破坏活动,还会破坏流程中运行的所有其他活动 .

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

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

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

相关问题