Câu trả lời:
getDefaultSharedPreferences
sẽ sử dụng một tên mặc định như "com.example.s Something_preferences", nhưng getSharedPreferences
sẽ yêu cầu một tên.
getDefaultSharedPreferences
trong thực tế sử dụng Context.getSharedPreferences
(bên dưới là trực tiếp từ nguồn Android):
public static SharedPreferences getDefaultSharedPreferences(Context context) {
return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
getDefaultSharedPreferencesMode());
}
private static String getDefaultSharedPreferencesName(Context context) {
return context.getPackageName() + "_preferences";
}
private static int getDefaultSharedPreferencesMode() {
return Context.MODE_PRIVATE;
}
getDefaultSharedPreferencesName
là không công khai vì tên là cần thiết cho khung sao lưu / khôi phục.
Hãy xem lại những điểm cơ bản của sự khác biệt:
getDefaultSharedPreferences()
sử dụng tên tệp ưu tiên mặc định. Mặc định này được đặt cho mỗi ứng dụng, vì vậy tất cả các hoạt động trong cùng bối cảnh ứng dụng có thể truy cập dễ dàng như trong ví dụ sau:
SharedPreferences spref = PreferenceManager.getDefaultSharedPreferences(this);
if (spref.contains("email")) {
String sEmailAddr = spref.getString("email", "");
}
Các ưu đãi thường được lưu trữ tại /data/data/com.package.name/shared_prefs/com.package.name_preferences.xml
.
Phương pháp thay thế - getSharedPreferences(name,mode)
yêu cầu chỉ ra tên (tệp) ưu tiên cụ thể và chế độ hoạt động (ví dụ: private, world_readable, v.v.)
Như copolii đã đề cập, kết quả là như nhau, nhưng tùy chọn đầu tiên đơn giản hơn và thiếu tính linh hoạt để phân chia thành nhiều tệp ưu tiên, được cung cấp bởi tùy chọn thứ hai getSharedPreferences()
. Chia sẻ tùy chọn giữa các ứng dụng bằng chỉ báo hoạt động MODE_WORLD_READABLE cũng là điều có thể sử dụng getSharedPreferences()
, nhưng hiếm khi được sử dụng.
IMHO, getDefaultSharedPreferences()
có thể được sử dụng một cách an toàn mà không bị nhầm lẫn với nhiều tên tệp ưu tiên dễ bị lỗi chính tả và nhầm lẫn, trừ khi bạn muốn các mô-đun khác nhau trong ứng dụng của mình sẽ sử dụng các tệp ưu tiên khác nhau. Thông thường điều này là không cần thiết. Nếu một ứng dụng cần lưu nhiều tham số, có thể sử dụng cơ sở dữ liệu bên ngoài sẽ tốt hơn vì nó cũng cung cấp bảo vệ dữ liệu tốt hơn.
Nếu ai đó biết lý do chính đáng để thường xuyên sử dụng getSharedPreferences () chứ không phải getDefaultSharedPreferences (), vui lòng cho tôi biết bằng cách nhận xét tại đây.
Tôi biết bài đăng này hơi cũ, nhưng vì 24.0.1 của thư viện hỗ trợ v7, bạn có thể truy xuất các tùy chọn mặc định theo ngữ cảnh ở bất cứ đâu bằng cách sử dụng
// context might be an application context, activity, ..
// so if you want to get your apps defaults, pass an activity context
PreferenceManager.getDefaultSharedPreferences(context)
Cũng có chức năng thứ 3:
public SharedPreferences Activity.getPreferences(int mode) {}
Xem câu hỏi và câu trả lời của tôi ở đây: Mess với các tùy chọn chia sẻ của Android - nên sử dụng chức năng nào?
Cả getSharedPreferences () và getDefaultSharedPreferences () đều được sử dụng để truy cập các tùy chọn cấp ứng dụng .getDefaultSharedPreferences () được sử dụng để có được các tùy chọn chia sẻ hoạt động theo khung ưu tiên chung của Android. getDefaultSharedPreferences () tốt hơn để sử dụng vì nó cung cấp cho đối tượng SharedPreferences hoạt động với PreferenceActivity theo mặc định.
Xin lưu ý rằng việc sử dụng tùy chọn chia sẻ mặc định KHÔNG giống như sử dụng tùy chọn chia sẻ với tên gói của bạn:
context.getSharedPreferences(getPackageName(), MODE_PRIVATE);
=> Tên của sở thích được chia sẻ: " com.my.packagename "
PreferenceManager.getDefaultSharedPreferences(context);
=> Tên của sở thích được chia sẻ: " com.my.packagename_preferences "
Context
ví dụ để gọi một trong hai.