Стандартные настройки Сохранение и метод доступа между действиями, виджетами, фоновыми службами и т. Д. В Android

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

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

Вот мой сценарий:

  • У меня есть приложение, которое может иметь несколько действий, несколько виджетов, несколько фоновых служб, а также несколько широковещательных приемников (я понимаю, что мы также используем приемник для виджета)...
  • Любой из упомянутых выше объектов может присутствовать или отсутствовать в зависимости от текущей ситуации, например, виджет может присутствовать на главном экране, в то время как никакие действия или фоновые службы не выполняются, или фоновая служба может работать, в то время как никакие действия не выполняются. момент, и это продолжается для всех других возможных ситуаций таким же образом ...
  • Также возможно, что, хотя виджет присутствует на главном экране, также выполняется действие, и может быть даже запущена служба и некоторые другие.
  • Службы могут работать в отдельном потоке.

Итак, исходя из этих условий, какой стандартный метод используется в Android для достижения моей цели сохранения данных и доступа между ними?

Мой обычный подход использует SharedPreferences следующим образом:

SharedPreferences p = getSharedPreferences("Settings", MODE_PRIVATE);

Но первая проблема заключается в том, что SharedPreferences нужен Context, а у меня его нет, например, в сервисе. Даже если я каким-то образом передам Context своей основной активности службе, что произойдет, когда эта активность будет завершена или уничтожена, в то время как та же служба все еще работает в отдельном потоке?

Поэтому, пожалуйста, если кто-нибудь может указать мне правильный способ сохранения и доступа к данным в таком сценарии или способ иметь всегда действительный Context внутри сервисов и виджетов и т. д. без какой-либо необходимости присутствия активности, поэтому вызов, например, getSharedPreferences("Settings", MODE_PRIVATE) из что Context всегда возвращает мне один и тот же объект SharedPreferences, с которым я могу работать с данными, хранящимися в нем из других источников, я был бы очень рад. Спасибо!


person Night2    schedule 17.10.2015    source источник
comment
Service – это Context   -  person Onik    schedule 17.10.2015
comment
@Onik: Вы имеете в виду, что у меня должен быть this.getContext в службе или this.getSharedPreferences?   -  person Night2    schedule 18.10.2015
comment
Да, это то, что я имею в виду.   -  person Onik    schedule 18.10.2015
comment
@Onik: я проверил это, и вы правы, у меня есть getSharedPreferences внутри службы, но что происходит, когда служба находится в отдельном потоке? Будет ли getSharedPreferences(x) таким же, как getSharedPreferences(x) в моей активности в другом потоке?   -  person Night2    schedule 18.10.2015
comment
но что происходит, когда служба находится в отдельном потоке? Это нормально, потому что она все еще находится в том же процессе, и все ресурсы приложения принадлежат процессу, независимо от того, из какого потока они доступны.   -  person Onik    schedule 18.10.2015
comment
@Onik: После некоторых тестов сегодня ваши комментарии и ответ, который вы удалили, очень помогли мне добиться того, что мне нужно, поскольку вы удалили ответ и предложили возможный дубликат, который в основном похож на мой случай, я принял его. Спасибо ...   -  person Night2    schedule 19.10.2015
comment
Повезло тебе! Сегодня я собирался отредактировать свой ответ, что потребовало бы больших усилий, учитывая такую ​​фундаментальную для Android проблему, как Контекст. Затем, просмотрев все эти бородатые посты по проблеме, я пришел к пониманию, что я бы не сказал лучше, чем уже сказано... Закрытие вопроса, как я думал, поможет вам сослаться на дублирующий (бородатый) вопрос ( и другое, связанное с ним) и найти правильный ответ. Если я ошибся, извините... :)   -  person Onik    schedule 19.10.2015
comment
Вы были правы, хотя вопрос в stackoverflow.com/questions /9109073/ не совсем такой, как у меня, ответы там охватывают то, что я спрашивал.   -  person Night2    schedule 19.10.2015


Ответы (1)


Вы можете получить доступ к SharedPreferences, используя контекст приложения, а не контекст действия.

getApplicationContext().getSharedPreferences("Settings",MODE_PRIVATE); 
person Vladimír Gašpar    schedule 17.10.2015
comment
Это где-нибудь доступно? Могу ли я использовать это так? public final class x extends Service { public void onCreate() { getApplicationContext()... } } и вот так public class x extends BroadcastReceiver { public void onReceive(){ getApplicationContext()... } } ? - person Night2; 18.10.2015
comment
Я читал этот ответ: stackoverflow.com/ questions/10641144/ говорит, что getApplicationContext() возвращает контекст для текущего процесса, и что, если я использую этот код в своей службе при создании? HandlerThread thread = new HandlerThread("ServiceStartArguments"); thread.start(); Я полагаю, что это новый поток. Он по-прежнему считается тем же контекстом, что и остальная часть приложения? - person Night2; 18.10.2015
comment
Вы можете использовать getApplicationContext в службе и onCreate, но если вы хотите получить доступ к контексту из любого места, просто определите WeakReference для приложения, а затем получите контекст приложения из слабой ссылки, подобной этой. public class receiver extends BroadcastReceiver { final WeakReference<Application> app = new WeakReference<Application>(); @Override public void onReceive(Context context, Intent intent) { app.get().getApplicationContext().getSharedPreferences - person Vladimír Gašpar; 18.10.2015
comment
Чтобы использовать контекст в отдельном процессе, вам нужно передать его в конструктор пользовательского потока. Кстати. использование статического контекста не является лучшей практикой и не рекомендуется из-за возможных утечек памяти. В большинстве случаев вы должны использовать WeakReference для извлечения контекста из любого места. - person Vladimír Gašpar; 18.10.2015
comment
Сейчас я немного запутался, я попробую сегодня и посмотрю, что произойдет, когда моя служба запустится в отдельном процессе. Я должен сначала узнать, что такое WeakReference, потому что никогда не слышал о нем раньше, а затем протестировать его. Если я заставлю это работать, я вернусь, чтобы принять ответ. - person Night2; 18.10.2015