static变量与App状态缓存

App启动,static变量装载过程

  1. 启动App
  2. OS开启新Process进程并分配进程ID(PID)及进程表
  3. 进程启动DVM实例(Dalvik VM,沙箱模式,每个App均运行在各自DVM内)
  4. DVM负责管理class类的装载、卸载、类实例的生命周期、GC回收等过程
  5. class类装载到DVM时,分配static变量空间并进行变量值初始化

static变量一旦初始化,将由JVM负责维护管理,除非遇到以下情形:

  • class类被卸载
  • JVM(DVM)被关闭
  • Process进程被终止

※ 随时对后台进程进行清理、回收任意资源并释放内存,此时static变量、实例变量将永久丢失数据,因此必须充分考虑在Application中缓存的数据的外部持久化及现场恢复问题,否则容易产生NullPointerException问题。尤其不应缓存、强依赖Context对象,必要时尽量考虑使用ApplicationContext取代。

Application中的缓存变量应该在onCreate方法中进行初始化,并且在 onLowMemory / onTrimMemory 中进行持久化存储。

Activity中的数据持久化不应该放在 onSaveInstanceState / onRestoreInstanceState 中进行,因为这两个方法不属于生命周期回调过程,不保证触发时机,应考虑在 onPause / onResume中执行持久化逻辑。


关于 onLowMemory 与 onTrimMemory

  • Android 4.0之后提供的API,用于系统通知内存不足,App进行必要的内存释放和现场保存
  • 在Application、Activity、Fragement、Service、ContentProvider中都实现了该接口
  • 也可通过 ComponentCallbacksComponentCallbacks2 注册监听器,实现外部监听
  • 内存不足时,依据当前App在后台App列表中的位置变化,多次触发 onTrimMemory 进行通知(此时当前App不会马上成为被清理对象)
  • 内存严重不足,并且当前App作为即将(下一个)被清理对象时回调 onLowMemory
  • 一键清理内存时不触发 onLowMemory,仅触发一次 onTrimMemory



作者:Wavky
链接:https://www.jianshu.com/p/61907bf34740
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值