#android #android-widget #persistence #android-preferences
#Android #android-виджет #постоянство #android-настройки
Вопрос:
Я создаю виджет, и мне нужно сохранить для него некоторые данные. У меня нет Activity
с виджетом, поэтому я не могу использовать SharedPreferences
. Данные, которые я храню, очень маленькие, но к ним часто обращаются, поэтому было бы излишним использовать для них базу данных. Я думал об использовании простых файлов, но это не кажется хорошим решением. Есть ли какой-либо способ сохранить простые данные для виджета?
Ответ №1:
Вам не нужен Activity
для сохранения настроек, просто Context
. В вашем классе, который расширяется AppWidgetProvider
, вы должны получить контекст во всех соответствующих методах, таких как onUpdate
и onDeleted
.
Затем вы можете использовать PreferenceManager
для получения объекта предпочтений и сохранения в нем того, что вам нужно, например, этого:
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds)
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
String value = prefs.getString("key-string", null);
if(value != null)
{
// do stuff
}
}
В качестве дополнительного примечания вы упоминаете, что рассматривали возможность использования файлов, но не захотели по соображениям производительности. SharedPreferences
объекты фактически в конечном итоге используют простые файлы, они просто управляются за вас Android. Если вы собираетесь часто обращаться к нему, вам все равно нужно будет следить за производительностью. То же самое справедливо и для баз данных SQLite, поскольку это тоже просто файлы.
Ответ №2:
Те обычные методы виджета, которые содержат контекст, верны, но что, если эти контексты изменятся? Например, одно приложение, вызывающее действие, которое прослушивает виджет с помощью onReceive и сохраняет данные в этом контексте, сможет прочитать их с помощью другого действия приложения? — другой контекст.
Что, если это переопределит приложение и получит его? — с activity работает, не уверен насчет widget!