Giới thiệu SharedPreferences
SharedPreferences lưu trữ cặp key-value đơn giản (XML). 5 phương thức chính:
edit(): tạo Editor để sửa đổi.commit(): ghi đồng bộ (blocking) ra file.apply(): ghi bất đồng bộ (non-blocking), an toàn cho UI thread.remove(key): xóa key.putX(key, value): lưu giá trị (String, int, boolean...).
Bước 1: Tạo project mới
Android Studio → File → New Project.
Bước 2: Giao diện (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText android:id="@+id/name" android:layout_width="match_parent"
android:layout_height="60dp" android:layout_marginTop="8dp"
android:hint="TÊN" app:layout_constraintTop_toTopOf="parent" />
<EditText android:id="@+id/address" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_marginTop="84dp"
android:hint="Số điện thoại" app:layout_constraintTop_toTopOf="@id/name" />
<Button android:id="@+id/button" android:layout_width="108dp"
android:layout_height="wrap_content" android:text="Lưu"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/address" />
<Button android:id="@+id/read" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Đọc"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/button" />
<TextView android:id="@+id/result" android:layout_width="wrap_content"
android:layout_height="0dp" android:text="kết quả"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/button" />
</android.support.constraint.ConstraintLayout>
Bước 3: MainActivity.java
package com.example.andy.myapplication;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final SharedPreferences prefs = getSharedPreferences("USER", MODE_PRIVATE);
final EditText name = findViewById(R.id.name);
final EditText address = findViewById(R.id.address);
final TextView result = findViewById(R.id.result);
Button save = findViewById(R.id.button);
Button read = findViewById(R.id.read);
read.setOnClickListener(v -> {
String n = prefs.getString("Name", "Chưa có tên");
String a = prefs.getString("Address", "Chưa có địa chỉ");
result.setText("Tên: " + n + "\nĐịa chỉ: " + a);
});
save.setOnClickListener(v -> {
String n = name.getText().toString().trim();
String a = address.getText().toString().trim();
if (n.isEmpty() || a.isEmpty()) {
Toast.makeText(this, "Nhập đầy đủ thông tin", Toast.LENGTH_LONG).show();
return;
}
SharedPreferences.Editor editor = prefs.edit();
editor.putString("Name", n);
editor.putString("Address", a);
editor.apply(); // Ghi bất đồng bộ, không block UI
Toast.makeText(this, "Đã lưu", Toast.LENGTH_SHORT).show();
});
}
}
commit() vs apply()
| commit() | apply() | |
|---|---|---|
| Đồng bộ | Có (block thread) | Không (async) |
| Trả về | boolean (thành công?) | void |
| Khuyên dùng | Cần biết kết quả ngay | UI thread, hiệu năng tốt hơn |
Chạy ứng dụng
Nhập tên/SĐT, nhấn "Lưu", sau đó nhấn "Đọc" để xem dữ liệu từ SharedPreferences.

