J2J.RU - cовременная система продвижения сайтов
Меню сайта

Категории раздела

Наш опрос
Меня больше интересуют приложения и игры для:
Всего ответов: 22

Файлы
Новые Популярные Лучшие


Теги
Android (34)
uCoz (8)
mobile (3)
sistem (3)
xml (3)
google (2)
html (2)
Oboi (2)
opera (2)
Rest (2)
soap (2)
action (1)
ajax (1)
App2SD (1)
apps (1)
CSS (1)
Ddms (1)
editor (1)
gmail (1)
gobook (1)
java (1)
legend (1)
Lite (1)
live (1)
mp3 (1)
mrtm (1)
Muse (1)
ninja (1)
pdf (1)
php (1)
Root (1)
sensor (1)
shazam (1)
sql (1)
thread (1)
touch (1)
UI (1)
Widget (1)
Worms (1)
Xplore (1)
Zirco (1)

RSS
  
Новостная лента.

Форумная лента.

Файловая лента.  

Главная » Статьи » Программинг » Программирование [ Добавить статью ]

Создание Google Android виджетов

С начала этого года команда разработчиков Android упорно работала над созданием нового релиза, который получил названиеAndroid 1.5. В его состав входит AppWidget framework, предназначенный для создания виджетов, которые пользователь может размещать на своем домашнем экране. Виджеты могут импортировать и отображать в удобной для пользователя форме информацию из Ваших Android приложений. Например, можно создать виджет, который будет отображать список невыполненных дел или давать информацию об играющей в фоновом режиме музыке.

Когда пользователь перетаскивает виждет на домашний экран, он фактически резервирует место, на котором будет отображаться контент из Вашего приложения. Кроме того, пользователь может взаимодействовать с Вашим приложением через виджет, например, приостанавливать проигрывание музыки. Если у Вас есть сервис, работающий в фоновом режиме, Вы можете обновлять виджет по собственному графику, или использовать стандартный механизм из AppWidget framework.

Виджет представляет собой BroadcastReceiver скрещенный с XML описанием параметров виждета. AppWidget frameworkсвязывается с Вашим виджетом через радиовещание, когда требуется обновление. Обновления строятся и посылаются с помощью RemoteViews, включающий контент, для отображения на домашней странице.

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

Прежде всего нужно создать XML описание виджета, указав там область домашнего экрана, которую Вы хотели бы зарезервировать для своего виджета, начальный слой для отображения, а также частоту обновления информации. Домашний экран Android разбит на ячейки, так что указанные вами размеры округляются до размеров ячеек. Это может сбить с толку. Возможно вам поможет вот эта формула

Минимальный размер в dip=(Число ячеек * 74dip)-2dip

В нашем примере мы хотим создать виджет, который будет занимать 2 ячейки в ширину и 1 в высоту. Это значит, что минимальный размер должен составлять 146dip x 72dip. Мы хотим, чтобы информация обновлялась раз в день, то есть через каждые 86,400,000 миллисекунд. XML metadata имеет вид:

<appwidget-provider
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:minWidth="146dip"
 android:minHeight="72dip"
 android:initialLayout="@layout/widget_message"
 android:updatePeriodMillis="86400000"
 />

Теперь давайте сопоставим эти XML данные и BroadcastReceiver в AndroidManifest:

<!-- Broadcast Receiver that will process AppWidget updates -->
<receiver android:name=".WordWidget" android:label="@string/widget_name">
 <intent-filter>
 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
 </intent-filter>
 <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_word" />
</receiver>

<!-- Service to perform web API queries -->
<service android:name=".WordWidget$UpdateService" />

Давайте напишем код для BroadcastReceiver, который будет управлять AppWidget запросами. Чтобы помочь виджету управлять различными радиовещательными событиями, разработчики написали класс AppWidgetProvider. Важно отметить, что мы запустим фоновый сервис, чтобы выполнять обновления. Это связано с тем, что BroadcastReceivers - потомок Application Not Responding (ANR) таймера, который может предложить пользователю закрыть приложение, если запрос выполняется слишком долго. Выполнение веб запроса может занимать несколько секунд, поэтому мы используем именно сервисы, чтобы избежать ANR таймаутов.

/**
 * Определяем простой виджет, который отображает слово дня. Для обновлений
 * мы порождаем фоновой сервис {@link Service} для выполнения API запросов.
 */
public class WordWidget extends AppWidgetProvider {
 @Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager,
 int[] appWidgetIds) {
 // Чтобы предотвратить любые ANR таймацты, мы выполняем обновление в сервисе.
 context.startService(new Intent(context, UpdateService.class));
 }
 
 public static class UpdateService extends Service {
 @Override
 public void onStart(Intent intent, int startId) {
 // Выполняем сегодняшнее обновление виджета.
 RemoteViews updateViews = buildUpdate(this);
 
 // Помещаем обновление этого выджета на домашний экран
 ComponentName thisWidget = new ComponentName(this, WordWidget.class);
 AppWidgetManager manager = AppWidgetManager.getInstance(this);
 manager.updateAppWidget(thisWidget, updateViews);
 }
 
 /**
 * Строим обновление виджета, чтобы показать текущее слово.
 * Заблокируем пока не получим online ответ.
 */
 public RemoteViews buildUpdate(Context context) {
 // Берем название месяца из ресурсов
 Resources res = context.getResources();
 String[] monthNames = res.getStringArray(R.array.month_names);
 
 // ищем текущий месяц и день
 Time today = new Time();
 today.setToNow();
 
 // Заголовок страницы в вмде "Wiktionary:Word of the day/March 21"
 String pageName = res.getString(R.string.template_wotd_title,
 monthNames[today.month], today.monthDay);
 RemoteViews updateViews = null;
 String pageContent = "";
 
 try {
 // Пытаемся послать запрос Wiktionary API для получения слова дня
 SimpleWikiHelper.prepareUserAgent(context);
 pageContent = SimpleWikiHelper.getPageContent(pageName, false);
 } catch (ApiException e) {
 Log.e("WordWidget", "Couldn't contact API", e);
 } catch (ParseException e) {
 Log.e("WordWidget", "Couldn't parse API response", e);
 }
 
 // Используем регулярное выражение для парсинга слов и их описания
 Pattern pattern = Pattern.compile(SimpleWikiHelper.WORD_OF_DAY_REGEX);
 Matcher matcher = pattern.matcher(pageContent);
 if (matcher.find()) {
 // Выполняем обновление контента виджета
 updateViews = new RemoteViews(context.getPackageName(), R.layout.widget_word);
 
 String wordTitle = matcher.group(1);
 updateViews.setTextViewText(R.id.word_title, wordTitle);
 updateViews.setTextViewText(R.id.word_type, matcher.group(2));
 updateViews.setTextViewText(R.id.definition, matcher.group(3).trim());
 
 // Когда пользователь кликает на виджет, запускается страница Wiktionary.
 String definePage = res.getString(R.string.template_define_url,
 Uri.encode(wordTitle));
 Intent defineIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(definePage));
 PendingIntent pendingIntent = PendingIntent.getActivity(context,
 0 /* no requestCode */, defineIntent, 0 /* no flags */);
 updateViews.setOnClickPendingIntent(R.id.widget, pendingIntent);
 
 } else {
 // Слово дня не найдено, показываем ошибку
 updateViews = new RemoteViews(context.getPackageName(), R.layout.widget_message);
 CharSequence errorMessage = context.getText(R.string.widget_error);
 updateViews.setTextViewText(R.id.message, errorMessage);
 }
 return updateViews;
 }
 
 @Override
 public IBinder onBind(Intent intent) {
 // Мы не хотим привязываться к этому сервису
 return null;
 }
 }
}
 

Все. Мы написали виджет для приложения Wiktionary "Слово дня". Когда требуется обновление, мы с помощью online API получаем новые данные. AppWidget framework автоматически запрашивает у нас обновления, например в момент добавления виджета на экран или согласно своему расписанию - раз в день.

Вообще виджеты стоит создавать для отображения не очень часто обновляемых данных (не чаще чем раз в час). Старайтесь обновлять информацию как можно реже и предусмотрите возможность ручного обновления.

Созданные таким образом виджеты можно размещать на любом домашнем экране, поддерживающим AppWidget framework.

http://www.mobilab.ru

Категория: Программирование | Добавил: Virus (28.11.2012)

Похожие темы на пост "Создание Google Android виджетов"

Схожие темы выбранные по тегам : google, создание, Android, виджет, программирование, виджетов
  
Просмотров: 2010 | Рейтинг: 0.0/0

Дорогие пользователи и гости сайта!!! Пожалуйста, если вам не сложно, оставте комментарий или ваше мнение о портале в Гостевой книге. Ваше мнение очень важно для нас и очень поможет в поиске дальнейшего пути развития сайта. С уважением, Администрация сайта AndroBum!



Так же рекомендуем:
Всего комментариев: 0
Информация:
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.

[ Регистрация | Вход ]
Поиск

Мини-чат

Block title
Virus
файлов: 69
Постов: 38
Комментов: 1005
Репутация: 0
Ранг:

droid
файлов: 3
Постов: 0
Комментов: 0
Репутация: 100
Ранг:

Serge
файлов: 1
Постов: 0
Комментов: 0
Репутация: 0
Ранг:

Sergey
файлов: 1
Постов: 0
Комментов: 0
Репутация: 0
Ранг:

Аватар не установлен! Blackfoxxx
файлов: 0
Постов: 0
Комментов: 0
Репутация: 0
Ранг:


Друзья сайта
  • Официальный блог
  • скрипты, шаблоны, html, css
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz

  • Статистика Сайта
    Статистика сайта как на сайте

    Пользователей всего: +0
    Материалов всего [?]: +
    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Гости сайта Пользователи

    Яндекс.Метрика




    Пользователи онлайн:


    Flag Counter



    Все материалы размещенные на сайте принадлежат их владельцам.
    Copyright dodomo.do.am © 2010-2012