Android Studio:如何利用Application操作全局变量

目录

一、全局变量是什么

二、如何把输入的信息存储到全局变量

[2.1 MainApplication类](#2.1 MainApplication类)

[2.2 XML文件](#2.2 XML文件)

三、全局变量读取

四、修改manifest

​编辑

五、效果展示


一、全局变量是什么

全局变量 是指在程序的整个生命周期内都可访问的变量,它的作用范围不限于某个函数、方法或类,而是可以被多个代码模块共享。

学习过java的可能会对此有些陌生,java中并没有全局变量的概念,但是在学习servlet的时候,必然接触过请求域和应用域,所谓的应用域对象servletContext,也就是servlet上下文对象,在这个对象中绑定的数据可以被所有用户所共享。比如setAttribute方法可以向域中绑定数据,getAttribute和removeAttribute分别可以从域中获取、移除数据。

类比来看,Application Scope(应用域) 很像 Java 的全局变量,因为它在整个应用程序的生命周期内都是可用的,适用于存储全局数据。

另外可以用单例模式来存储"全局变量":

java 复制代码
public class GlobalManager {
    private static GlobalManager instance = new GlobalManager();
    
    private String data;

    private GlobalManager() {}  // 私有构造方法,防止外部实例化

    public static GlobalManager getInstance() {
        return instance;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

//设置全局变量
GlobalManager.getInstance().setData("Hello");

这样读取的时候,就会有固定的输出内容:

java 复制代码
System.out.println(GlobalManager.getInstance().getData()); // 输出: Hello

在AS中Application的生命周期覆盖了全过程,不像Activity活动页面,一旦页面关闭生命周期就进入destroy,利用全生命特性,可以用来存储全局变量。

二、如何把输入的信息存储到全局变量

先看第一段代码,其作用就是把用户的注册信息保存到全局变量hashmap中。

java 复制代码
public class AppWriteActivity extends AppCompatActivity implements View.OnClickListener, CompoundButton.OnCheckedChangeListener {
    private EditText et_name; // 声明一个编辑框对象
    private EditText et_age; // 声明一个编辑框对象
    private EditText et_height; // 声明一个编辑框对象
    private EditText et_weight; // 声明一个编辑框对象
    private boolean isMarried = false;
    private String[] typeArray = {"未婚", "已婚"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_app_write);
        et_name = findViewById(R.id.et_name);
        et_age = findViewById(R.id.et_age);
        et_height = findViewById(R.id.et_height);
        et_weight = findViewById(R.id.et_weight);
        CheckBox ck_married = findViewById(R.id.ck_married);
        ck_married.setOnCheckedChangeListener(this);
        findViewById(R.id.btn_save).setOnClickListener(this);
        findViewById(R.id.btn_intent).setOnClickListener(this);
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        isMarried = isChecked;
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_save) {
            String name = et_name.getText().toString();
            String age = et_age.getText().toString();
            String height = et_height.getText().toString();
            String weight = et_weight.getText().toString();
            if (TextUtils.isEmpty(name)) {
                ToastUtil.show(this, "请先填写姓名");
                return;
            } else if (TextUtils.isEmpty(age)) {
                ToastUtil.show(this, "请先填写年龄");
                return;
            } else if (TextUtils.isEmpty(height)) {
                ToastUtil.show(this, "请先填写身高");
                return;
            } else if (TextUtils.isEmpty(weight)) {
                ToastUtil.show(this, "请先填写体重");
                return;
            }
            // 获取当前应用的Application实例
            MainApplication app = MainApplication.getInstance();
            // 以下直接修改Application实例中保存的映射全局变量
            app.infoMap.put("name", name);
            app.infoMap.put("age", age);
            app.infoMap.put("height", height);
            app.infoMap.put("weight", weight);
            app.infoMap.put("married", typeArray[!isMarried ? 0 : 1]);
            app.infoMap.put("update_time", DateUtil.getNowDateTime("yyyy-MM-dd HH:mm:ss"));
            ToastUtil.show(this, "数据已写入全局内存");
        }
        if (v.getId() == R.id.btn_intent){
            // 创建Intent对象,启动 AppReadActivity
            Intent intent = new Intent(AppWriteActivity.this, AppReadActivity.class);

            // 启动目标Activity
            startActivity(intent);
        }
    }

}

2.1 MainApplication类

其中,我自定义了一个MainApplication类,具体代码如下:

这个自定义 Application 类的作用

  1. 存储全局数据

    • 定义了 infoMap 变量,用于存储一些全局信息,比如用户输入的数据。
    • 由于 Application 的生命周期与应用相同(应用启动 -> 关闭),infoMap 里的数据在应用运行期间都是有效的。
  2. 提供 getInstance() 方法,作为单例使用

    • MainApplication 使用 mApp 作为静态实例,并在 onCreate() 里初始化它,这样,任何地方都可以通过 MainApplication.getInstance() 访问 Application,不用每次都 getApplication()
java 复制代码
public class MainApplication extends Application {
    private static MainApplication mApp;
    public HashMap<String,String> infoMap =new HashMap<String,String>();

    public static MainApplication getInstance(){
        return mApp;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mApp = this;
    }
}

2.2 XML文件

信息收集的页面示意图,其具体代码如下:

XML 复制代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="40dp" >

        <TextView
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="姓名:"
            android:textColor="@color/black"
            android:textSize="17sp" />

        <EditText
            android:id="@+id/et_name"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="3dp"
            android:layout_marginTop="3dp"
            android:layout_toRightOf="@+id/tv_name"
            android:background="@drawable/editext_selector"
            android:gravity="left|center"
            android:hint="请输入姓名"
            android:inputType="text"
            android:maxLength="12"
            android:textColor="@color/black"
            android:textSize="17sp" />
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="40dp" >

        <TextView
            android:id="@+id/tv_age"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="年龄:"
            android:textColor="@color/black"
            android:textSize="17sp" />

        <EditText
            android:id="@+id/et_age"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="3dp"
            android:layout_marginTop="3dp"
            android:layout_toRightOf="@+id/tv_age"
            android:background="@drawable/editext_selector"
            android:gravity="left|center"
            android:hint="请输入年龄"
            android:inputType="number"
            android:maxLength="2"
            android:textColor="@color/black"
            android:textSize="17sp" />
    </RelativeLayout>
    
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="40dp" >

        <TextView
            android:id="@+id/tv_height"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="身高:"
            android:textColor="@color/black"
            android:textSize="17sp" />

        <EditText
            android:id="@+id/et_height"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="3dp"
            android:layout_marginTop="3dp"
            android:layout_toRightOf="@+id/tv_height"
            android:background="@drawable/editext_selector"
            android:gravity="left|center"
            android:hint="请输入身高"
            android:inputType="number"
            android:maxLength="3"
            android:textColor="@color/black"
            android:textSize="17sp" />
    </RelativeLayout>
    
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="40dp" >

        <TextView
            android:id="@+id/tv_weight"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="体重:"
            android:textColor="@color/black"
            android:textSize="17sp" />

        <EditText
            android:id="@+id/et_weight"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="3dp"
            android:layout_marginTop="3dp"
            android:layout_toRightOf="@+id/tv_weight"
            android:background="@drawable/editext_selector"
            android:gravity="left|center"
            android:hint="请输入体重"
            android:inputType="numberDecimal"
            android:maxLength="5"
            android:textColor="@color/black"
            android:textSize="17sp" />
    </RelativeLayout>
    
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="40dp" >

        <CheckBox
            android:id="@+id/ck_married"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:checked="false"
            android:text="已婚"
            android:textColor="@color/black"
            android:textSize="17sp" />
    </RelativeLayout>
    
    <Button
        android:id="@+id/btn_save"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="保存到全局内存"
        android:textColor="@color/black"
        android:textSize="17sp" />
    <Button
        android:id="@+id/btn_intent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳转到读取页面"/>

</LinearLayout>

三、全局变量读取

这里的代码是从全局变量infoMap中读取用户的注册信息

java 复制代码
public class AppReadActivity extends AppCompatActivity {
	private TextView tv_app; // 声明一个文本视图对象
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_app_read);
		tv_app = findViewById(R.id.tv_app);
		readAppMemory(); // 读取全局内存中保存的变量信息
	}

	// 读取全局内存中保存的变量信息
	private void readAppMemory() {
		String desc = "全局内存中保存的信息如下:";
		// 获取当前应用的Application实例
		MainApplication app = MainApplication.getInstance();
		// 获取Application实例中保存的映射全局变量
		Map<String, String> mapParam = app.infoMap;
		// 遍历映射全局变量内部的键值对信息
		for (Map.Entry<String, String> item_map : mapParam.entrySet()) {
			desc = String.format("%s\n %s的取值为%s",
					desc, item_map.getKey(), item_map.getValue());
		}
		if (mapParam.size() <= 0) {
			desc = "全局内存中保存的信息为空";
		}
		tv_app.setText(desc);
	}
	
}

四、修改manifest

五、效果展示

可以看到全局变量的信息已经被页面2所获取。

相关推荐
&有梦想的咸鱼&1 小时前
Android Room 框架表现层源码深度剖析(三)
android
peakmain92 小时前
Compose UI 组件封装——水平/垂直、虚线/实现的使用(一)
android
_一条咸鱼_3 小时前
Android Dagger2 框架编译时注解处理模块深度剖析(二)
android
KdanMin4 小时前
[特殊字符] 深度实战:Android 13 系统定制之 Recovery 模式瘦身指南
android
夜猫子分享4 小时前
DeepSeek-R1:开源大模型的技术革命与行业影响分析
android·deepseek
pengyu5 小时前
系统化掌握Flutter开发之导航器(Navigator)(一):页面跳转的“指挥官”
android·flutter·dart
Ever696 小时前
Android中实现多线程的几种方式
android
QING6186 小时前
Android AIDL 开发指南:包含注意事项、兼容性问题
android·kotlin·app
Ya-Jun6 小时前
依赖注入框架Hilt与Dagger2原理剖析
android
帅次6 小时前
Flutter FloatingActionButton 从核心用法到高级定制
android·flutter·macos·ios·kotlin·android-studio