You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求Android Java跨Activity用SharedPreferences存取用户数据的实现代码

嘿,这问题我太熟了!用SharedPreferences在两个Activity之间存取数据是Android开发里很常见的需求,而且实现起来一点不复杂。我给你整理了一套完整的方案,包括封装工具类(推荐这么做,省得重复写代码),还有两个Activity的具体实现,直接抄就能用!

核心逻辑说明

SharedPreferences是Android提供的轻量级键值对存储方案,它的数据是全局可访问的——只要你用同一个存储名称,不管在哪个Activity里都能读写,完美解决跨页面共享数据的需求。

第一步:封装SharedPreferences工具类(推荐)

我习惯把SharedPreferences的操作封装成一个单例工具类,这样不用在每个Activity里重复写获取实例、编辑数据的代码,还能避免拼写错误。直接新建一个SharedPrefManager.java类:

import android.content.Context;
import android.content.SharedPreferences;

public class SharedPrefManager {
    // 定义存储文件的名称,全局统一
    private static final String PREF_NAME = "MyAppPrefs";
    private static SharedPrefManager instance;
    private SharedPreferences sharedPreferences;
    private SharedPreferences.Editor editor;

    // 私有构造方法,保证单例
    private SharedPrefManager(Context context) {
        sharedPreferences = context.getApplicationContext().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        editor = sharedPreferences.edit();
    }

    // 获取单例实例
    public static synchronized SharedPrefManager getInstance(Context context) {
        if (instance == null) {
            instance = new SharedPrefManager(context);
        }
        return instance;
    }

    // 保存字符串类型数据
    public void saveString(String key, String value) {
        editor.putString(key, value);
        editor.apply(); // 异步提交,比commit更高效
    }

    // 获取字符串类型数据,默认值为空字符串
    public String getString(String key) {
        return sharedPreferences.getString(key, "");
    }

    // 保存整数类型数据
    public void saveInt(String key, int value) {
        editor.putInt(key, value);
        editor.apply();
    }

    // 获取整数类型数据,默认值为0
    public int getInt(String key) {
        return sharedPreferences.getInt(key, 0);
    }

    // 保存布尔类型数据
    public void saveBoolean(String key, boolean value) {
        editor.putBoolean(key, value);
        editor.apply();
    }

    // 获取布尔类型数据,默认值为false
    public boolean getBoolean(String key) {
        return sharedPreferences.getBoolean(key, false);
    }

    // 清空所有数据(可选)
    public void clearAll() {
        editor.clear();
        editor.apply();
    }
}
第二步:在第一个Activity中保存数据

假设第一个Activity是MainActivity.java,比如我们在点击按钮时保存用户输入的用户名和年龄:

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private EditText etUsername, etAge;
    private Button btnSaveAndJump;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        etUsername = findViewById(R.id.et_username);
        etAge = findViewById(R.id.et_age);
        btnSaveAndJump = findViewById(R.id.btn_save_jump);

        btnSaveAndJump.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 获取用户输入的内容
                String username = etUsername.getText().toString().trim();
                int age = Integer.parseInt(etAge.getText().toString().trim());

                // 调用工具类保存数据
                SharedPrefManager.getInstance(MainActivity.this).saveString("username", username);
                SharedPrefManager.getInstance(MainActivity.this).saveInt("age", age);

                // 跳转到第二个Activity
                startActivity(new Intent(MainActivity.this, SecondActivity.class));
            }
        });
    }
}

对应的布局文件activity_main.xml(简单示例):

<?xml version="1.0" encoding="utf-8"?>
<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="16dp">

    <EditText
        android:id="@+id/et_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入用户名"/>

    <EditText
        android:id="@+id/et_age"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入年龄"
        android:inputType="number"/>

    <Button
        android:id="@+id/btn_save_jump"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="保存并跳转"/>
</LinearLayout>
第三步:在第二个Activity中读取数据

第二个ActivitySecondActivity.java,在页面加载时读取之前保存的数据并显示:

import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {
    private TextView tvInfo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        tvInfo = findViewById(R.id.tv_info);

        // 调用工具类读取数据
        String username = SharedPrefManager.getInstance(this).getString("username");
        int age = SharedPrefManager.getInstance(this).getInt("age");

        // 显示数据
        tvInfo.setText(String.format("用户名:%s\n年龄:%d", username, age));
    }
}

对应的布局文件activity_second.xml:

<?xml version="1.0" encoding="utf-8"?>
<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="16dp">

    <TextView
        android:id="@+id/tv_info"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"/>
</LinearLayout>
几个要注意的坑
  • 一定要用getApplicationContext()来获取SharedPreferences,避免因为Activity上下文被回收导致的问题。
  • 编辑完数据后必须调用apply()或者commit(),不然数据不会被保存!apply()是异步提交,不会阻塞主线程,推荐用这个;commit()是同步提交,会阻塞线程,一般只在需要知道提交结果的时候用。
  • 键名要统一,最好用常量来定义键名,比如在工具类里加public static final String KEY_USERNAME = "username";,这样就不会因为拼写错误导致读不到数据。

内容的提问来源于stack exchange,提问作者user9283483

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:55:18