You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android Worker中获取SharedPreferences实例?

Worker类访问SharedPreferences的可行实现方案

方案1:直接使用Worker内置的ApplicationContext操作

Worker构造方法默认会传入上下文参数,可直接通过applicationContext属性调用getSharedPreferences,无需依赖Activity实例,是官方推荐的最简方案:

// Kotlin 示例代码
class CustomWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
    override fun doWork(): Result {
        // 直接通过applicationContext获取SP实例
        val sharedPref = applicationContext.getSharedPreferences("你的SP配置文件名", Context.MODE_PRIVATE)
        // 执行读写操作
        sharedPref.edit().putString("worker_data", "测试数据").apply()
        val getData = sharedPref.getString("worker_data", "")
        return Result.success()
    }
}

如果是Java版本示例:

// Java 示例代码
public class CustomWorker extends Worker {
    public CustomWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("你的SP配置文件名", Context.MODE_PRIVATE);
        // 读写操作
        sharedPref.edit().putString("worker_data", "测试数据").apply();
        String getData = sharedPref.getString("worker_data", "");
        return Result.success();
    }
}

方案2:封装全局SP工具类统一调用

如果项目多处需要访问SharedPreferences,可封装单例工具类,在Application初始化时传入全局上下文,任意组件(包括Worker、Service等非Activity组件)都可以直接调用:

  • 首先自定义Application类,初始化工具类
class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        SpUtil.init(this)
    }
}
  • 实现SP单例工具类
object SpUtil {
    private lateinit var appContext: Context
    private val sp by lazy {
        appContext.getSharedPreferences("全局SP文件名", Context.MODE_PRIVATE)
    }

    // 仅在Application中调用一次初始化
    fun init(context: Context) {
        appContext = context.applicationContext
    }

    // 封装读写方法,可根据需求扩展
    fun saveString(key: String, value: String) {
        sp.edit().putString(key, value).apply()
    }

    fun getString(key: String, defaultVal: String = ""): String {
        return sp.getString(key, defaultVal) ?: defaultVal
    }
}
  • Worker中直接调用工具类
class CustomWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
    override fun doWork(): Result {
        SpUtil.saveString("worker_test", "从Worker存储的数据")
        val data = SpUtil.getString("worker_test")
        return Result.success()
    }
}

注意:所有场景下操作SharedPreferences都优先使用ApplicationContext,禁止传入Activity实例的Context,避免页面销毁时引发内存泄漏。

内容的提问来源于stack exchange,提问作者Julius Babies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:06:03