`
v5browser
  • 浏览: 1136513 次
社区版块
存档分类
最新评论

android 使用Application保存全局变量

 
阅读更多

做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方法, 就欧了
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics