У меня появилось стойкое ощущение того, что блог поймал позитивную волну прироста показателей и уже имеющиеся материалы на сайте пользуются интересом у пользователя. Дабы разнообразить блог, сегодня оповещаю об открытии новой категории "Android". Я долго думал, о чем можно написать про эту очень распространенную ОС, когда есть столько официальной документации, огромное множество переводов на Хабре этой же документации, форумов еще больше, рассказывающих что да как. Поэтому, во избежании пересечения с уже решенными и осветленными проблемами (хотя такое возможно), я перейду шаг за шагом просто к изложению тех проблем и их решений, которые возникли у меня во время создания приложения для массового использования. 

К слову на днях мы опубликовались на Android Market, приложение можно найти тут.

Ну вроде со всем определился, перейду к изложению вопроса "Как обновить настройки виджета из PreferenceActivity?" К чему это применимо? - немного попытаюсь смоделировать ситуацию. Представьте, вы поставили на рабочий стол виджет, на котором отображается какая-то информация, допустим это rss-канал. У вас есть возможность перейти в параметры виджета и поменять канал на другой. Это не представляет особого труда в реализации, но сам виджет не будет знать, что вы поменяли канал, по крайней мере сразу. Есть на это некоторые причины, например Google рекомендует обновлять виджет не чаще чем раз в пол часа во избежании больших затрат энергии. В таком случае нам надо сообщать виджету, что настройки поменялись и обновить его. На момент решения этой проблемы я работал с Android'ом всего ничего, когда пытался раздобыть полезную информацию по этому поводу - увы, ничего не находил - пришлось вычитывать документацию и придумывать выход. Благо ответ был рядом и... 

Решение подразумевает, что будет использоваться OnSharedPreferenceChangeListener, который позволит вызвать нам внутри нашего класса call-back метод в случае изменения настроек в PreferenceActivity. Постараюсь очень урезано накидать структуру класса: 

public class Widget extends AppWidgetProvider {

	//... бла-бла

	@Override
	public void onEnabled(Context context) {
		//...
	}

	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
		//...
	}

	public void onDisabled(Context context) {
		//...
	}

	public static class UpdateService extends Service implements OnSharedPreferenceChangeListener {
		@Override
		public void onStart(Intent intent, int startId) {
			//...

			//... регистрируем листнер изменения настроек
			PreferenceManager.getDefaultSharedPreferences(this)
			.registerOnSharedPreferenceChangeListener(this);

			//...
		}

		//будет вызван при смене значения в ключе rss_adress
		public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
			//обновляем виджет через RemoteViews
		}
	}
}

В общем, если рассматривать эту структуру при выполнении, то цикл получится следующий: 

  • запускаем настройки (это у нас отдельное PreferenceActivity, тут не описано, предполагается, что с этим нет проблем);
  •  в настройках через UI мы что-то меняем, в нашем случае это адрес rss канала; 
  • новый адрес записывается в настройках по ключу, который вы определили в вашем preference.xml (например android:key="rss_adress"); 
  • наш листнер ловит изменение настройки по ключу rss_adress
  • и вызывает onSharedPreferenceChanged(), в котором мы выполняем все, что хотим видеть по изменению настроек. 

Вот такой краткий гайд по работе с настройками в android и первая моя статья в это теме. Всегда с уважением, Я!


Знаете ли вы?

Что трещина по стеклу распространяется со скоростью примерно 1,3 км/сек. Чтобы сфотографировать это событие, необходимо, чтобы снимки делались каждую миллионную долю секунды.

KDPsite...