Contents
  1. 1. 生命周期之外的全局变量
  2. 2. 生命周期内的全局变量

说到全局变量,可能在教科书里面都不建议我们使用,但是在实际开发过程中,会发现全局变量其实带来了很大的便捷性。虽然Android在不同的Activity切换时可以把要传递的值传到Intent里面(iOS中也有类似的方法),但是当我们应用的页面很多,逻辑渐渐复杂了之后,全局变量就带来了非常大的便利。

我个人总结了之后,把全局变量分成了两大类:

  1. 程序生命周期之外的全局变量

    这种全局变量当程序被kill了之后,依旧可以保存下来,当程序下次启动的时候,依然有效。最常见的就是用户名、密码之类的了。当然,如果你要保存的数据非常多,而且数据量比较大,就需要用轻量级的数据库来保存了。

  2. 生命周期之内的全局变量

    顾名思义,当程序被kill之后,下次启动了之后,这些变量就被重新初始化,这些变量只在此次生命周期之内有效。最常见的就是页面之间要传递的参数了,这些参数并不需要在程序被强制结束之后依旧保存。

我们就分类来看吧!

生命周期之外的全局变量

一般来说,这类全局变量不会很多,如果很多的话,就要使用sqlite等数据库了,所以,我的这些全局变量是放在你自己定义的一个公共方法类(我的命名为CommonUtil)里面的,这个类一般都是自定义的,不继承自任何类。在这个类里面,我们定义下面的成对的方法来设置和获取全局变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* Description: 设置和获取用户名
*/
public static void setAccount(String account){
SharedPreferences sp = context.getSharedPreferences("YOUR APP'S NAME", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("ACCOUNT",""); // 先清空原始数据
editor.putString("ACCOUNT",account);
editor.commit();
}

public static String getAccount() {
SharedPreferences sp = context.getSharedPreferences("YOUR APP'S NAME", Activity.MODE_PRIVATE);
return sp.getString("ACCOUNT", "");
}

注:

  1. 必须通过Context提供的getSharedPreferences(String, int)来获得实例。该方法的第一个参数是指定XML文件名(不包含“.xml”后缀)的字符串,方法会去读取出对应的文件,创建一个SharedPreferences对象。第二个参数指定文件的访问权限,共有4中可选模式,从API 17开始基于安全的考虑,MODE_WORLD_READABLEMODE_WORLD_WRITEABLE已经被废弃使用,只有MODE_PRIVATEMODE_MULTI_PROCESS可使用,一般情况下指定MODE_PRIVATE即可。
  2. 这里的Context我一般是建议选择整个Application的context,而不是某一个Activity的context,因为整个application的context生命周期在大多数情况下要长于特定的activity的context。至于如何获取,很简单一个函数getApplicationContext()
  3. 我这里的context其实是我自定义的类中的一个static成员变量,在程序初次加载的时候,就把application的context赋予它,我们也可以在函数的形参中赋值进去。
  4. SharedPreferences所能存储的类型被限定在了Stringintlongfloatboolean这些基础数据类中,唯一的集合类型也只是Set<String>,而它看起来更像是用来作为不能有重复数据的数组。

生命周期内的全局变量

在上一篇Blog中也有用到这里的内容,一般来说,生命周期内的全局变量可以有很多,不同页面之间传递或者有交叉使用的变量都可以放进来,所以我们通常也另外写一个单独的类,只不过和第一种不一样,这个类需要继承自Application

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

import android.app.Application;

/**
* File Description: 记录程序中的公共变量
* 这里面的公共变量包括程序时候在前台运行、页面间传递的变量等,程序退出后即清空;
* 用户名、密码等需要程序在退出后仍然可以保留的变量记录在CommonUtil中
* Created by KAKA on 16/2/6 21:57
* 本类中的公共变量有:
* is_active_ 程序是否处于前台状态
*/
public class CommonVariables extends Application {

private boolean is_active_;

/**
* Description: 初始化各成员变量(公共变量)
* Created by KAKA on 16/2/7 09:34
*/
@Override
public void onCreate() {
super.onCreate();
setIsActive(true);
}

/**
* 记录程序是否处于活跃状态
*/
public boolean getIsActive() {
return is_active_;
}

public void setIsActive(boolean is_active) {
is_active_ = is_active;
}
}

只要用到的,我们都可以继续在这个类里面继续补充。
当然,我们的AndroidManifest文件中也要做相应的修改。

1
2
3
4
5
6
7
8
<application
android:name=".Utils.CommonVariables"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
...

添加android:name=".Utils.CommonVariables"属性

Contents
  1. 1. 生命周期之外的全局变量
  2. 2. 生命周期内的全局变量