SharedPreferences क्या है?
SharedPreferences Android में की-वैल्यू जोड़े के रूप में छोटी मात्रा में प्रिमिटिव डेटा स्टोर करने का एक सरल तंत्र है। डेटा XML फाइल में प्राइवेट मोड में स्टोर होता है और ऐप रीस्टार्ट के बाद भी बना रहता है।
समर्थित डेटा टाइप्स
StringintlongfloatbooleanSet<String>(API 11+)
मुख्य मेथड्स
| मेथड | विवरण |
|---|---|
edit() | Editor इंस्टेंस प्राप्त करें |
putString(key, value) | स्ट्रिंग सेव करें |
putInt(key, value) | इंटीजर सेव करें |
putBoolean(key, value) | बूलियन सेव करें |
getString(key, defValue) | स्ट्रिंग पढ़ें (डिफ़ॉल्ट के साथ) |
getInt(key, defValue) | इंटीजर पढ़ें |
contains(key) | की मौजूदगी चेक करें |
remove(key) | की हटाएं |
clear() | सभी डेटा हटाएं |
apply() | एसिंक्रोनस सेव (पसंदीदा) |
commit() | सिंक्रोनस सेव, बूलियन रिटर्न |
बुनियादी उपयोग
SharedPreferences प्राप्त करना
// प्राइवेट प्रेफरेंस (केवल इस ऐप के लिए)
SharedPreferences prefs = getSharedPreferences("my_prefs", MODE_PRIVATE);
// डिफ़ॉल्ट प्रेफरेंस (एक्टिविटी/कॉन्टेक्स्ट स्कोप)
SharedPreferences defaultPrefs = PreferenceManager.getDefaultSharedPreferences(context);
डेटा लिखना
SharedPreferences.Editor editor = prefs.edit();
editor.putString("username", "john_doe");
editor.putInt("age", 25);
editor.putBoolean("is_logged_in", true);
editor.putFloat("rating", 4.5f);
editor.putLong("last_login", System.currentTimeMillis());
// सेट सेव करना (API 11+)
Set tags = new HashSet<>(Arrays.asList("android", "kotlin", "java"));
editor.putStringSet("tags", tags);
// एसिंक्रोनस कमिट (अनुशंसित)
editor.apply();
// या सिंक्रोनस (जब तुरंत परिणाम चाहिए)
boolean success = editor.commit();
डेटा पढ़ना
String username = prefs.getString("username", "guest"); // डिफ़ॉल्ट "guest"
int age = prefs.getInt("age", 0);
boolean isLoggedIn = prefs.getBoolean("is_logged_in", false);
float rating = prefs.getFloat("rating", 0f);
long lastLogin = prefs.getLong("last_login", 0);
// सेट पढ़ना
Set tags = prefs.getStringSet("tags", new HashSet<>());
// अस्तित्व जांच
if (prefs.contains("username")) {
// की मौजूद है
}
पूर्ण उदाहरण: लॉगिन फॉर्म
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="24dp">
<EditText
android:id="@+id/etUsername"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="उपयोगकर्ता नाम" />
<EditText
android:id="@+id/etPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:hint="पासवर्ड"
android:inputType="textPassword" />
<CheckBox
android:id="@+id/cbRemember"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="मुझे याद रखें" />
<Button
android:id="@+id/btnLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="लॉगिन" />
<Button
android:id="@+id/btnLogout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="लॉगआउट" />
<TextView
android:id="@+id/tvStatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:gravity="center"
android:textSize="16sp" />
</LinearLayout>
MainActivity.java
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private static final String PREFS_NAME = "login_prefs";
private static final String KEY_USERNAME = "username";
private static final String KEY_PASSWORD = "password"; // वास्तविक ऐप में पासवर्ड सेव न करें!
private static final String KEY_REMEMBER = "remember_me";
private SharedPreferences prefs;
private EditText etUsername, etPassword;
private CheckBox cbRemember;
private TextView tvStatus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
etUsername = findViewById(R.id.etUsername);
etPassword = findViewById(R.id.etPassword);
cbRemember = findViewById(R.id.cbRemember);
tvStatus = findViewById(R.id.tvStatus);
// सेव्ड क्रेडेंशियल्स लोड करें
loadSavedCredentials();
Button btnLogin = findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(v -> attemptLogin());
Button btnLogout = findViewById(R.id.btnLogout);
btnLogout.setOnClickListener(v -> logout());
}
private void loadSavedCredentials() {
if (prefs.getBoolean(KEY_REMEMBER, false)) {
String username = prefs.getString(KEY_USERNAME, "");
String password = prefs.getString(KEY_PASSWORD, "");
etUsername.setText(username);
etPassword.setText(password);
cbRemember.setChecked(true);
tvStatus.setText("स्वागत है, " + username + "!");
}
}
private void attemptLogin() {
String username = etUsername.getText().toString().trim();
String password = etPassword.getText().toString().trim();
if (username.isEmpty() || password.isEmpty()) {
Toast.makeText(this, "कृपया सभी फ़ील्ड भरें", Toast.LENGTH_SHORT).show();
return;
}
// यहां वास्तविक प्रमाणीकरण होगा (API कॉल, आदि)
// डेमो के लिए: कोई भी नॉन-खाली क्रेडेंशियल वैध है
boolean success = true;
if (success) {
if (cbRemember.isChecked()) {
saveCredentials(username, password);
} else {
clearCredentials();
}
tvStatus.setText("लॉगिन सफल: " + username);
Toast.makeText(this, "लॉगिन सफल", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "अमान्य क्रेडेंशियल्स", Toast.LENGTH_SHORT).show();
}
}
private void saveCredentials(String username, String password) {
prefs.edit()
.putString(KEY_USERNAME, username)
.putString(KEY_PASSWORD, password)
.putBoolean(KEY_REMEMBER, true)
.apply();
}
private void clearCredentials() {
prefs.edit()
.remove(KEY_USERNAME)
.remove(KEY_PASSWORD)
.putBoolean(KEY_REMEMBER, false)
.apply();
etUsername.setText("");
etPassword.setText("");
cbRemember.setChecked(false);
tvStatus.setText("लॉगआउट हो गया");
}
private void logout() {
clearCredentials();
tvStatus.setText("आप लॉगआउट हो गए");
Toast.makeText(this, "लॉगआउट सफल", Toast.LENGTH_SHORT).show();
}
}
सर्वोत्तम अभ्यास और सुरक्षा
- संवेदनशील डेटा न सेव करें: पासवर्ड, टोकन, क्रेडिट कार्ड नंबर कभी SharedPreferences में न रखें। इसके लिए EncryptedSharedPreferences (Jetpack Security) या Keystore उपयोग करें
- MODE_PRIVATE उपयोग करें (डिफ़ॉल्ट) - अन्य ऐप्स एक्सेस न कर सकें
- apply() प्राथमिकता दें - UI थ्रेड ब्लॉक नहीं करता
- डिफ़ॉल्ट मान हमेशा प्रदान करें - NullPointerException से बचने के लिए
- कुंजी नामकरण: स्थिरांक (
KEY_*) उपयोग करें टाइपो से बचने के लिए
EncryptedSharedPreferences (API 23+)
// build.gradle
implementation "androidx.security:security-crypto:1.1.0-alpha03"
// उपयोग
MasterKeys.AliasSpec spec = MasterKeys.AES256_GCM_SPEC;
String masterKeyAlias = MasterKeys.getOrCreate(spec);
SharedPreferences encryptedPrefs = EncryptedSharedPreferences.create(
"secret_prefs",
masterKeyAlias,
context,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
);
// अब सामान्य SharedPreferences की तरह उपयोग करें
encryptedPrefs.edit().putString("api_token", "secret_token").apply();