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

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

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

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

生命周期之内的全局变量

顾名思义,当程序被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", "");

}

注:

必须通过Context提供的getSharedPreferences(String, int)来获得实例。该方法的第一个参数是指定XML文件名(不包含“.xml”后缀)的字符串,方法会去读取出对应的文件,创建一个SharedPreferences对象。第二个参数指定文件的访问权限,共有4中可选模式,从API 17开始基于安全的考虑,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE已经被废弃使用,只有MODE_PRIVATE和MODE_MULTI_PROCESS可使用,一般情况下指定MODE_PRIVATE即可。

这里的Context我一般是建议选择整个Application的context,而不是某一个Activity的context,因为整个application的context生命周期在大多数情况下要长于特定的activity的context。至于如何获取,很简单一个函数getApplicationContext()

我这里的context其实是我自定义的类中的一个static成员变量,在程序初次加载的时候,就把application的context赋予它,我们也可以在函数的形参中赋值进去。

SharedPreferences所能存储的类型被限定在了String、int、long、float、boolean这些基础数据类中,唯一的集合类型也只是Set,而它看起来更像是用来作为不能有重复数据的数组。

生命周期内的全局变量

在上一篇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

36import 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

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"属性

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐