如何在Android 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
相关产品推荐
相关产品推荐

