Sự khác biệt giữa getDefaultSharedPreferences và getSharedPreferences


224

Sự khác biệt giữa getDefaultSharedPreferencesgetSharedPreferencestrong Android là gì? Bất cứ ai có thể giải thích?


Một sự khác biệt gần như quá rõ ràng là một là tĩnh và một là không. Nhưng nó không thực sự quan trọng, vì bạn cần một Contextví dụ để gọi một trong hai.
LarsH

Câu trả lời:


224

getDefaultSharedPreferencessẽ sử dụng một tên mặc định như "com.example.s Something_preferences", nhưng getSharedPreferencessẽ yêu cầu một tên.

getDefaultSharedPreferencestrong 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;
}

9
Để xấu getDefaultSharedPreferencesNamelà không công khai vì tên là cần thiết cho khung sao lưu / khôi phục.
Martin


Và làm thế nào để nghe thay đổi tùy chọn, trong chế độ getSharedPreferences sử dụng tên tùy chỉnh cho sở thích? (không sử dụng tên mặc định như getSharedPreferences "com.example.s Something_preferences")
Dr.jacky

Bạn có thể vui lòng thêm một liên kết đến nguồn?
Mr_and_Mrs_D

@Mr_and_Mrs_D tìm kiếm nó dễ dàng hơn. Nếu tôi thêm một liên kết thì đó sẽ là một phiên bản API cụ thể, có thể là hoặc không phải là thứ bạn đang tìm kiếm.
copolii

120

Hãy xem lại những điểm cơ bản của sự khác biệt:

  1. 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.

  2. 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.


7
Lý do của tôi là: stackoverflow.com/questions/10786172/
Khăn

1
Và làm thế nào để nghe thay đổi tùy chọn, trong chế độ getSharedPreferences sử dụng tên tùy chỉnh cho sở thích? (không sử dụng tên mặc định như getSharedPreferences "com.example.s Something_preferences")
Dr.jacky

Dr.jacky Tôi muốn nói rằng bạn sẽ kết thúc sở thích của mình trong một số loại đối tượng giống Phiên: lớp Phiên {prefs = getSharedPreferences () ...} và sau đó sử dụng getters và setters cho những thứ bạn muốn theo dõi. Khi setters được gọi, bạn có thể kích hoạt các sự kiện trong logic setter.
Alex Weavers

2

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)

Xem https://developer.android.com/reference/android/support/v7/preference/PreferenceManager#getdefaultsharedpreferences


PreferenceManager đang bị phản đối trong Android Q. Bạn vẫn có thể sử dụng cách mọi thứ của context.getSharedPreferences. Đã thay đổi cuộc gọi này thành bối cảnh.getSharedPreferences ("$ {packName} _preferences", MODE_PRIVATE)
Kevin

2
Có vẻ như PreferenceManager đang bị phản đối vì nó mới được chuyển đến Androix. developer.android.com/reference/androidx/preference/ trên
FutureShocked


1

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.


0

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 "

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.