求Android Java跨Activity用SharedPreferences存取用户数据的实现代码
嘿,这问题我太熟了!用SharedPreferences在两个Activity之间存取数据是Android开发里很常见的需求,而且实现起来一点不复杂。我给你整理了一套完整的方案,包括封装工具类(推荐这么做,省得重复写代码),还有两个Activity的具体实现,直接抄就能用!
核心逻辑说明
SharedPreferences是Android提供的轻量级键值对存储方案,它的数据是全局可访问的——只要你用同一个存储名称,不管在哪个Activity里都能读写,完美解决跨页面共享数据的需求。
我习惯把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
相关产品推荐
相关产品推荐

