一般来说当应用退到后台后,内存不足的情况下,会销毁 Activity 甚至 Service ,静态变量也是如此。 对于稍微大点的项目来说,难免用到静态全局变量,然而一旦静态变量被清空,就很容易出现空指针异常。
我的设想: 通过静态方法来访问静态变量,并在应用启动后做个静态标记 如果调用的时候,发现静态变量为空,并且静态标记被清空了,就重启应用。(好像记得微信如果退到后台很久后,回来会从欢迎页面开始)
也看到有人说在 Activity 的 onSaveInstanceState 中保存,然后恢复。我觉得界面太多,容易遗漏,如果添加一个新的静态变量,估计还得修改 n 遍,不合适。
虽然我是 《 app 开发从上架到上吊》 的铁粉,但活还得继续干。期待各位大佬的表现。
1
billlee 2017-04-25 22:34:54 +08:00
静态变量不可能被回收的,难道你的变量突然变成了悬空引用?一定是你的程序逻辑有问题,在某些启动的代码路径上没有对静态变量进行初始化。
尽量少用静态变量,如果一定要用,最好在声明的地方直接初始化。 |
2
TakWolf 2017-04-26 03:23:54 +08:00
在 Android 中,静态变量被收回 = 应用进程被回收了,你可以理解成 jvm 都没了。
不用想的很复杂,需要长久保存的数据,直接存到 sharedpreferences 里面,如果频繁读取,再用静态变量去做个内存缓存 |
3
ittianyu OP |
4
rogerchen 2017-04-26 09:11:07 +08:00 via Android
@ittianyu 不就是重新初始化了?系统要你死你还能不死? http://stackoverflow.com/questions/1944369/android-static-object-lifecycle
|
5
mind3x 2017-04-26 09:16:07 +08:00 via Android
@TakWolf 说的没错,是你的进程被干掉又重建了才会有你观察到的所谓静态变量被回收,不只是 activity 被重建。
另外,我早些年是写 JVM 的,所以不用叫我自行百度哈 😂 |
6
AndyWing520 2017-04-26 10:07:24 +08:00
如果静态变量会在正常运行过程中被回收,那还叫静态变量吗
Activity 也是个 Object ,被回收也不会导致内部的静态变量被回收 被回收(你说的清空现象)只会出现在 2 种情况 1.代码逻辑导致某处逻辑清空 2.静态变量所处的进程被干掉然后又被你重启了,但是没有赋值 |
7
TakWolf 2017-04-26 10:40:34 +08:00
你这种人,真不想回复你
|
8
ittianyu OP @mind3x
@AndyWing520 测试了好几遍,按 HOME 退到后台,疯狂开其他应用,然后在 Android Monitor 可以看到其实应用的进程已经挂了,通过 HOME 回到应用,发现并不会走 Splash 界面,重新创建了上次退出的界面,这个时候,之前在 Splash 界面 设置的 静态变量被清空了。有什么好办法直接重启应用,重新走一遍初始化流程。 |
10
mind3x 2017-04-26 13:25:42 +08:00 1
@ittianyu 进程级别需要初始化的,在你的 Application 的 onCreate 里搞。另外你需要弄清楚各组件的 life cycle 。
|
12
AndyWing520 2017-04-27 20:31:47 +08:00
@ittianyu "通过 HOME 回到应用,发现并不会走 Splash 界面,重新创建了上次退出的界面" 这是正常的,因为通过 recentsapp 去切换是指定了上次的 activity 的,你的进程可能是因为低内存导致的回收吧,也可能是 rom 的一些后台杀进程的机制,所以这个进程的所有变量(无论是静态还是非静态)都是回收的,想在被杀回后再切换回来时候可以显示 splash 界面可以通过 check 一些静态变量的值然后做跳转(?或者其他显示行为)操作
|