【问题标题】:access sharedpreferences in class without passing context在不传递上下文的情况下访问类中的 sharedpreferences
【发布时间】:2015-01-18 22:39:30
【问题描述】:

我有一个重载 onPerformSync 的 SyncAdapter。在这种方法中,我想访问 sharedpreferences 来获取和放置设置。据我了解,为此我需要访问上下文。 SyncAdapter onPerformSync 有一个 bundle 参数,也许我可以用这种方式发送上下文。

在类似的问题中,我有另一个基类(不是服务或活动),我也对使用 sharedPreferences 感兴趣。为此,我要么需要将上下文传递给类中的方法,要么使用上下文实例化它,然后将其保存为私有成员。

在这两种情况下,我都明白,在与上下文关联的活动或服务的生命周期之外保留和使用上下文可能会导致内存泄漏。

就我而言,我的应用程序可以从广播接收器或主要活动开始。广播接收器启动一个后台进程,而主活动只是启动主活动。无论哪个先打开,都会定期注册 SyncAdapter 更新并打开另一个类。因此,如果我要传递调用活动或服务的上下文,如果其中任何一个关闭会发生什么? SyncAdapter 或基类将使用过时的上下文,并且...内存泄漏?或者上下文是否会恢复到仍在运行的状态?

我也看到了解决方案:(Static way to get 'Context' on Android?),但这能解决什么问题吗?然后,我将拥有一个活动上下文、一个应用程序上下文和一个服务上下文。同样的问题对吗? SyncAdapter 可能最终会保留已关闭的上下文,不是吗?

根据此处的第一个答案 (SharedPreferences application context vs activity context),我很想使用上一个链接中列出的应用程序单例,但我想确定一下。谢谢

【问题讨论】:

    标签: java android android-context android-syncadapter


    【解决方案1】:

    我认为您想要做的是创建一个Service 来管理SyncAdapter,就像提到的here 一样。这样,传递给ServiceContextSyncAdapter 运行时应该是有效的。

    该链接显示您会将Service.getApplicationContext() 传递给SyncAdapter 构造函数。然后你可以将Context 存储为SyncAdapter 中的一个字段,并在需要时使用它。只要您需要,Context 就应该有效。

    当应用程序和/或SyncAdapter 获得 GC'd 时,它们应该构建一个新的 SyncAdapter,并在您下次需要时使用新的 Context

    【讨论】:

      猜你喜欢
      • 2012-07-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 2017-12-28
      • 2020-01-18
      相关资源
      最近更新 更多