Android - How to use SharedPreferences in non-Activity class?

SharedPreferences are related to context. You can only reference it through a context.

You can simply pass context as a parameter to your class. For example in the constructor.

In your activity do:

MyClass myClass = new MyClass(this);

The solution i found to this was:

1-In an MainActivity class (i.e always launched before getting any context in project) create a static variable for the context:

public static Context contextOfApplication;

2-In an important method of this class (Such as onCreate, the constructor, etc) initialize this variable using the getApplicationContext method:

public void onCreate() {
    contextOfApplication = getApplicationContext();
}

3-In the same class Create a "getter" method for this variable (it must also be static):

public static Context getContextOfApplication(){
    return contextOfApplication;
}

4-In the non-activity class get the context by calling the created method statically:

Context applicationContext = MyActivityClass.getContextOfApplication();

5-Use the PreferenceManager Class to get the SharedPreferences variable:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(applicationContext);

Hope it helps.


In Kotlin, there's a nice & simple wrapper-based solution – just copy & paste the code into a new AppPreferences.kt file and follow the 4 TODO steps outlined in the code:

import android.content.Context
import android.content.Context.MODE_PRIVATE
import android.content.SharedPreferences
import androidx.core.content.edit

object AppPreferences {
    private var sharedPreferences: SharedPreferences? = null

    // TODO step 1: call `AppPreferences.setup(applicationContext)` in your MainActivity's `onCreate` method
    fun setup(context: Context) {
        // TODO step 2: set your app name here
        sharedPreferences = context.getSharedPreferences("<YOUR_APP_NAME>.sharedprefs", MODE_PRIVATE)
    }

    // TODO step 4: replace these example attributes with your stored values
    var heightInCentimeters: Int?
        get() = Key.HEIGHT.getInt()
        set(value) = Key.HEIGHT.setInt(value)

    var birthdayInMilliseconds: Long?
        get() = Key.BIRTHDAY.getLong()
        set(value) = Key.BIRTHDAY.setLong(value)

    private enum class Key {
        HEIGHT, BIRTHDAY; // TODO step 3: replace these cases with your stored values keys

        fun getBoolean(): Boolean? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getBoolean(name, false) else null
        fun getFloat(): Float? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getFloat(name, 0f) else null
        fun getInt(): Int? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getInt(name, 0) else null
        fun getLong(): Long? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getLong(name, 0) else null
        fun getString(): String? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getString(name, "") else null

        fun setBoolean(value: Boolean?) = value?.let { sharedPreferences!!.edit { putBoolean(name, value) } } ?: remove()
        fun setFloat(value: Float?) = value?.let { sharedPreferences!!.edit { putFloat(name, value) } } ?: remove()
        fun setInt(value: Int?) = value?.let { sharedPreferences!!.edit { putInt(name, value) } } ?: remove()
        fun setLong(value: Long?) = value?.let { sharedPreferences!!.edit { putLong(name, value) } } ?: remove()
        fun setString(value: String?) = value?.let { sharedPreferences!!.edit { putString(name, value) } } ?: remove()

        fun remove() = sharedPreferences!!.edit { remove(name) }
    }
}

Now from anywhere within your app you can get a value like this:

val heightInCentimeters: Int? = AppPreferences.heightInCentimeters
val heightOrDefault: Int = AppPreferences.heightInCentimeters ?: 170

Setting a value to the SharedPreferences is just as easy:

AppPreferences.heightInCentimeters = 160 // sets a new value