Nếu có một tập hợp khoá-giá trị tương đối nhỏ cần lưu, bạn nên sử dụng các API SharedPreferences
.
Đối tượng SharedPreferences
trỏ đến một tệp chứa các cặp khoá-giá trị và cung cấp các phương thức đơn giản để đọc và ghi các cặp khoá đó. Mỗi tệp SharedPreferences
do khung này quản lý và có thể ở chế độ riêng tư hoặc dùng chung.
Trang này cho bạn biết cách sử dụng các API SharedPreferences
để lưu trữ và truy xuất các giá trị đơn giản.
Lưu ý: API SharedPreferences
dùng để đọc và ghi các cặp khoá-giá trị và bạn không nên nhầm lẫn với API Preference
giúp bạn tạo giao diện người dùng cho các chế độ cài đặt ứng dụng (mặc dù các API đó cũng sử dụng SharedPreferences
để lưu các chế độ cài đặt của người dùng). Để biết thông tin về API Preference
, xem bài viết Hướng dẫn cho nhà phát triển về các chế độ cài đặt.
Tìm hiểu và học cách xử lý lựa chọn ưu tiên dùng chung
Bạn có thể tạo tệp lựa chọn ưu tiên dùng chung mới hoặc truy cập một tệp hiện có bằng cách gọi một trong các phương thức sau:
getSharedPreferences()
– Sử dụng phương thức này nếu bạn cần nhiều tệp lựa chọn ưu tiên dùng chung được xác định theo tên mà bạn chỉ định bằng tham số đầu tiên. Bạn có thể gọi phương thức này từContext
bất kỳ trong ứng dụng của mình.getPreferences()
– Sử dụng phương thức này từActivity
nếu bạn chỉ cần sử dụng một tệp lựa chọn ưu tiên dùng chung cho hoạt động. Vì phương thức này truy xuất tệp lựa chọn ưu tiên chung mặc định thuộc về hoạt động, nên bạn không cần cung cấp tên.
Ví dụ: Mã sau đây truy cập tệp lựa chọn ưu tiên dùng chung mà chuỗi tài nguyên R.string.preference_file_key
xác định và mở bằng chế độ riêng tư để chỉ ứng dụng của bạn mới có thể truy cập tệp:
Kotlin
val sharedPref = activity?.getSharedPreferences( getString(R.string.preference_file_key), Context.MODE_PRIVATE)
Java
Context context = getActivity(); SharedPreferences sharedPref = context.getSharedPreferences( getString(R.string.preference_file_key), Context.MODE_PRIVATE);
Khi đặt tên cho tệp lựa chọn ưu tiên dùng chung, bạn nên sử dụng tên có thể xác định danh tính chính xác đối với ứng dụng của mình. Thêm tiền tố là ID ứng dụng vào tên tệp sẽ giúp bạn dễ dàng thực hiện việc này. Ví dụ:
"com.example.myapp.PREFERENCE_FILE_KEY"
Ngoài ra, nếu chỉ cần một tệp lựa chọn ưu tiên dùng chung cho hoạt động của mình, bạn có thể sử dụng phương thức
getPreferences()
:
Kotlin
val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)
Java
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
Thận trọng:
Chúng tôi đã ngừng sử dụng chế độ MODE_WORLD_READABLE
và
MODE_WORLD_WRITEABLE
kể từ API cấp 17.
Kể từ Android 7.0 (API cấp 24), Android sẽ đưa ra (throw)
SecurityException
nếu bạn sử dụng những chế độ đó. Nếu cần chia sẻ các tệp riêng tư với các ứng dụng khác, thì ứng dụng của bạn có thể sử dụng FileProvider
bằng
FLAG_GRANT_READ_URI_PERMISSION
.
Để biết thêm thông tin, xem thêm bài viết Chia sẻ tệp.
Nếu đang sử dụng API SharedPreferences
để lưu chế độ cài đặt ứng dụng, thì bạn nên sử dụng getDefaultSharedPreferences()
để tải tệp lựa chọn ưu tiên dùng chung mặc định cho toàn bộ ứng dụng của mình. Để biết thêm thông tin, xem bài viết Hướng dẫn cho nhà phát triển về các chế độ cài đặt.
Ghi vào lựa chọn ưu tiên dùng chung
Để ghi vào tệp lựa chọn ưu tiên dùng chung, hãy tạo SharedPreferences.Editor
bằng cách gọi edit()
trên
SharedPreferences
của bạn.
Lưu ý: Bạn có thể chỉnh sửa các lựa chọn ưu tiên dùng chung một cách an toàn hơn
bằng cách gọi phương thức edit()
trên đối tượng
EncryptedSharedPreferences
thay vì trên đối tượng SharedPreferences
. Để tìm hiểu thêm,
xem hướng dẫn về cách làm việc với dữ liệu một cách an toàn hơn.
Truyền các khoá và giá trị mà bạn muốn ghi bằng các phương thức như
putInt()
và
putString()
. Sau đó, hãy gọi
apply()
hoặc
commit()
để lưu các thay đổi. Ví dụ:
Kotlin
val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return with (sharedPref.edit()) { putInt(getString(R.string.saved_high_score_key), newHighScore) apply() }
Java
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putInt(getString(R.string.saved_high_score_key), newHighScore); editor.apply();
apply()
thay đổi ngay đối tượng
SharedPreferences
trong bộ nhớ nhưng ghi nội dung cập nhật vào ổ đĩa
một cách không đồng bộ. Ngoài ra, bạn có thể sử dụng commit()
để ghi dữ liệu vào ổ đĩa một cách đồng bộ. Tuy nhiên, commit()
có tính đồng bộ nên bạn cần tránh gọi từ luồng chính, vì tính năng này có thể tạm dừng việc hiển thị giao diện người dùng.
Đọc từ lựa chọn ưu tiên dùng chung
Để truy xuất các giá trị từ một tệp lựa chọn ưu tiên dùng chung, hãy gọi các phương thức như
getInt()
và
getString()
, cung cấp khoá cho giá trị
bạn muốn và có thể chọn làm giá trị mặc định để trả về nếu không có khoá. Ví dụ:
Kotlin
val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return val defaultValue = resources.getInteger(R.integer.saved_high_score_default_key) val highScore = sharedPref.getInt(getString(R.string.saved_high_score_key), defaultValue)
Java
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); int defaultValue = getResources().getInteger(R.integer.saved_high_score_default_key); int highScore = sharedPref.getInt(getString(R.string.saved_high_score_key), defaultValue);