доступ к общим настройкам в классе без передачи контекста

У меня есть SyncAdapter, перегружающий onPerformSync. В этом методе я хотел бы получить доступ к общим настройкам, чтобы получить и установить настройки. Насколько я понимаю, для этого мне нужен доступ к контексту. SyncAdapter onPerformSync имеет аргумент пакета, и, возможно, я мог бы отправить контекст таким образом.

В аналогичной проблеме у меня есть другой базовый класс (не служба или действие), для которого я также заинтересован в использовании sharedPreferences. Для этого мне нужно либо передать контекст методу в классе, либо создать его экземпляр с контекстом, который затем сохраняется как частный член.

Я понимаю, что в обоих этих случаях сохранение и использование контекста за пределами жизненного цикла действия или службы, связанной с контекстом, может привести к утечке памяти.

В моем случае мое приложение может начинаться либо с широковещательного приемника, либо с основной активности. Широковещательный приемник запускает фоновый процесс, а основное действие просто запускает основное действие. Тот, который открывается первым, регистрирует периодические обновления SyncAdapter и открывает другой класс. Итак, если бы я передал контекст вызывающего действия или службы, что произойдет, если один из них затем закроется? SyncAdapter или базовый класс будут использовать устаревший контекст и... утечку памяти? Или контекст вернется к тому, что осталось работающим?

Я также видел решение этого: (Статический способ получить "Контекст" на Android ?), но исправит ли это что-нибудь? Тогда у меня будет контекст действия, контекст приложения и контекст службы. Точно такая же проблема? SyncAdapter может в конечном итоге удерживать закрытый контекст, не так ли?

Основываясь на первом ответе здесь (контекст приложения SharedPreferences и контекст действия), я У меня возник соблазн использовать одноэлементное приложение, указанное в предыдущей ссылке, но я хочу убедиться. Спасибо


person james proctor    schedule 20.11.2014    source источник


Ответы (1)


Я думаю, что вы хотите сделать, это создать Service для управления SyncAdapter как упомянуто здесь. Таким образом, Context, переданный в Service, должен быть действительным, пока работает SyncAdapter.

Ссылка показывает, что вы должны передать Service.getApplicationContext() конструктору SyncAdapter. Затем вы можете сохранить это Context как поле в SyncAdapter и использовать его, когда вам нужно. Этот Context должен быть действителен столько, сколько вам нужно.

Когда приложение и/или SyncAdapter получают сборщик мусора, они должны создать новый SyncAdapter с новым Context в следующий раз, когда он вам понадобится.

person Leo Landau    schedule 20.11.2014