做jee的童鞋肯定都知道一点, 就是有些变量是要放在ServletContext中的, 因为ServletContext是不会销毁的(除非服务器宕机了).
那么我们在Android里面是不是也有类似ServletContext这种东东存放全局变量呢.? 答案是肯定的.
首先我们了解下为什么要把某些东东存在全局变量里面.
android有一种机制, 在内存不足的前提下优先考虑杀死在后台的Activity(生命周期处于onStop的), 然而这个Activity里面有一些与用户交互的或者是其他的一些数据还未保存.?
怎么办呢?
1:你可以重写Activity的onSaveInstanceState和onRestoreInstanceState方法, 在onSaveInstanceState方法中保存需要的一些数据,onRestoreInstanceState再把这些数据拿过来
2:我们可以在Activity的onStop方法里面把这些值存在全局变量里面
Android提供了一个类似于ServletContext的全局变量, 叫Application. 我们可以利用它存储一些全局变量!
那么有人会问了, 内存不足不是你的东西会被系统杀掉吗?
大家请明白一点, 因为内存不足杀掉Activity/Service等一些组件,那也只是杀掉一些线程而已.! 我们这里的Application就是你的进程, 每个应用在android的Linux系统中
都会是一个单独的进程, 除非是出了异常或者手动被杀掉, 不然一旦应用程序运行之后,进程是不会被杀的.
也就是说, Android只是杀掉某个或者某几个Activity, 或者是直接把某个Task给结束掉而已, 所以我们可以放心大胆的把某些全局变量存在Application里面.
而且Application生命周期方法里面还有个onTerminate方法, 当被终止的时候我们还可以把这些全局变量存起来, 下回onCreate的时候再恢复.
这里我推荐大家在用Appcation存值得时候在Application里面写一个Map就好了, 因为变量太多得话会显得那个类很臃肿.
下面给出示例:
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import android.app.Application;
public class MyApplication extends Application {
private Map<String, Object> mData;
public Map<String, Object> getmData() {
return mData;
}
@Override
public void onCreate() {
super.onCreate();
mData = new HashMap<String, Object>();
//synchronized the map
mData = Collections.synchronizedMap(mData);
// then restore your map
}
public void onTerminate() {
super.onTerminate();
//save data of the map
}
}
然后在AndroidManifest里面配置<application>节点的属性
<application android:name=".MyApplication">
.....
最后, 写个测试的Activity, 调用getApplication方法, 就欧了