Хочу рассказать о том, как я начал программировать под android, и что из этого получилось
Я давно хотел поменять свой телефон Nokia E66 на что-нибудь новое и красивое. Думал, думал и купил себе новую игрушку — HTС Desire. На носу был день рождения, всего-то месяц оставался, получился отличный подарок самому себе. Телефон, а точнее, операционка на нем — Android, произвел на меня неизгладимое впечатление. Первый месяц на работе все говорили, ну что ты гладишь свой телефончик. Давно меня так не цеплял новый гаджет. А я все игрался, ставил новые приложения и в какой-то момент подумал, а почему бы не попробовать написать что-то самому. Об этом читайте под катом…
Я 15 лет в ИТ, первые 10 занимался программированием. Ну и решил тряхнуть стариной.
Я прочитал Android SDK Developer’s Guide. Этап настройки Eclipse, SDK и все такое я прошел быстро благодаря некоему Gars Vogella, который подробно описал процесс инсталляции, настройки и пошаговое создание первых простеньких приложений. С учетом того, что Eclipse я видел первый раз в жизни, эта ссылка оказалась незаменимой.
Я понял, как примерно устроены приложения, и теперь для закрепления материала надо было написать свое приложение.
Тут началось самое интересное. Писать не понятно что, не хотелось. Хотелось сделать что-то, что будет востребовано пользователями, и чем будут пользоваться долго и с удовольствием. Ну или хотя бы несколько раз и не снесут сразу. В голову стали приходить какие-то сложные навороченные идеи с непонятным будущем. Пришлось сразу откинуть. В общем-то было понятно, что во-первых, сложное сделать сразу не смогу, a во-вторых, в относительно короткие сроки точно не сделаю, а растягивать удовольствие на месяцы ни малейшего желания не было.
Хотелось сделать и что-то и с картами и gps и с интернетом и виджет и сервис и многопоточное приложение и социальные сети и много еще чего. И все сразу. Метался от одной идеи к другой, пока случайно не подумал про анекдоты. Честно говоря, сейчас я уже не помню, почему всплыли именно анекдоты. Пошел на сайт www.anekdot.ru, увидел там RSS, а дальше идея быстро обросла очертаниями. Идею с картами и GPS я откинул на потом, на следующее приложение.
Первоначальные требования получились такие:
1. Виджет 4×2. (в результате сделал 4×1)
a. Перед запуском — выбор RSS, с какого использовать
b. Анекдоты прокручиваются, timeout на прокрутку
c. Подгрузка rss автоматическая 1 раз в сутки после 0 часов + ручное принудительное обновление
d. При входе в приложение — лента всех анекдотов из текущего RSS
2. Приложение
a. Сверху список возможных RSS
b. Внизу лента анекдотов
c. При длительном клике — всплывающее меню (открыть в интернете, facebook, twitter, ВКонтакте)
d. Настройка
i. нескольких RSS url
ii. Скорость прокрутки анекдотов в виджете
iii. Глубина хранения загруженных RSS в днях
3. Каждый анекдот надо показывать в отдельной рамке со скругленными краями
В процессе я их незначительно уточнял.
И, собственно, началось самое интересное — программирование. На java я раньше ничего не делал, но поскольку долго программировал на С#, то проблем в языке не было. Дальше началось кропотливое изучение SDK. Сами понимаете, делать первое приложение это не то, что по шагам повторить пример из учебника.
Название программы получилось такое: «Anekdot on Android». То, что оно начиналось на букву «a» оказалось на руку, т.к. в списке приложений оно было всегда сверху. Жаль, что в маркете сортировка не по алфавиту.
Итак, первое, что надо было сделать, это скачать RSS с анекдотами и распарсить RSS. Немного погуглив, я нашел rssutils.jar. Это была моя ошибка, но об этом в конце. Все оказалось довольно просто. Только эмулятор страшно тормозил. Но в последствии на телефоне все летало.
Дальше я стал делать виджет. Но не просто показать текст, а чтоб нажать на него можно было и т.д. и т.п.
Периодически я затыкался на каких-то ерундовых на первый взгляд проблемах, но решение искалось долго и нудно. Обычно так всегда и бывает. У меня уже был готов widget и главная activity, на виджете стали наживаться кнопки, он что-то делал, и тут… я обнаружил что кнопки на виджете нажимаются только, если он уже был запущен, и я под дебаггингом запускаю приложение. Ввиду постоянных изысканий кода я успел поменять уже порядочно и долго не мог понять, что же я сломалось. Я перерыл кучу форумов но такое странное поведение нигде не было описано. Случайно я обнаружил, что если поместить на экран несколько виджетов, то не работает из них только первый. Я потратил несколько вечеров на поиск проблемы, зашел в тупик и отложил разработку под android на несколько дней, пока ездил в Прагу в отпуск.
Надо сказать, что времени на android уходил много. Почти каждый вечер до поздна я сидел надо своим ноутбуком. На улице была холодрыга и это способствовало программированию.
Короче говоря, потом оказалось, что если определять RemoteViews в нескольких местах заново каждый раз, то widget ведет себя не корректно. Все решилось созданием одного метода, который первый раз заполнял, а далее возвращал уже заполненную переменную с RemoteViews. Причем учтите, что в widget нельзя полагаться на локальные private поля класса. Они могут обнулиться в любой момент.
И вот ура! Я опубликовал версию 1.0.0. На разработку ушло примерно 1 мес вечерних бдений.
Один паршивец написал плохой отзыв, начинавшийся со слов «Хрень полная». С учетом того, сколько времени я потратил на написание приложение, мне было просто обидно.
За первые 2 недели приложение было скачано 350, активных инсталляций чуть больше 50%.
Дальше была запланирована сразу версия 1.1, которую недавно выложил в маркет. Главные добавки — публикация в Facebook и Twitter анекдота прямо из приложения. Вроде простая фишка, но я решал, что это будет чуть ли не главной изюминкой приложения. Время покажет, был ли я прав.
Описание API Twitter на сайт twitter.com замороченное. Т.е. понятно, как работает, но не понятно, как это просто и быстро реализовать. Я нашел отличный пример, как это сделать. Из-за подключенных библиотек APK файл сразу потяжелел более, чем на 100 kb.
У Facebook оказалось отличное описанное API по авторизации. Гораздо все проще и понятнее, чем у Twitter. Подключение заняло минимум времени. Зато не понятное описание, как работать дальше после авторизации. Пришлось искать примеры. Из минусов по сравнению с Twitter не понял, можно ли сохранить авторизацию так, чтобы окошко логина в facebook не показывалось после первого поста анекдота в facebook после запуска программы.
Как только я выложил версию новую версию, мой знакомый сказал, что у него программа вообще не работает. Пишет, что не может подключиться к интернету. После недолгих изысканий стало понятно, что на версии Android 2.1 библиотека rssutils.jar не работает и возвращает пустой вариант. К интернету она коннектилась, но данные не отдавала. В результате я написал сам парсер rss feed. Ничего сложного в этом нет. Примеров, как это сделать, полно. Но мой парсер поддерживает только одну единственную версию rss, который используется на сайте anekdot.ru.
В общем было как-то так.
После выкладывания основной версии Anekdot On Android 1.1 я стал активно продвигать ее: сделал посты в facebook, попросил своих коллег лайкнуть.
Первые результаты -+100 инсталляций за первый день. Посмотрим, что будет дальше.
Интересна статистика, которую выдает маркет:
Статистика по версии ОС
1 Android 2.2 73.2% (175)
2 Android 2.1 25.1% (60)
3 Android 1.6 0.8% (2)
4 Android 2.3.3 0.4% (1)
Статистика по девайсам:
1 HTC Desire 16.7% (40)
2 HTC Desire HD 15.5% (37)
3 Samsung Galaxy S 8.8% (21)
4 LG Optimus One 7.9% (19)
5 HTC Wildfire 7.1% (17)
6 Samsung Galaxy Tab 4.2% (10)
7 a1 2.9% (7)
8 SEMC Xperia X10 2.5% (6)
9 Huawei U8230 2.5% (6)
10 HTC Evo 4G 2.1% (5)
Статистика по странам:
1 Russia 40.2% (96)
2 Ukraine 12.6% (30)
3 United States 10.9% (26)
4 Germany 9.2% (22)
5 Belarus 8.8% (21)
6 Israel 2.1% (5)
7 Kazakhstan 2.1% (5)
8 Lithuania 1.3% (3)
9 Belgium 1.3% (3)
10 Italy 0.8% (2)
Из статистики по странам я сделал вывод, что анекдоты интересны в странах, где народ ностальгирует по России, по шуткам и т.п.
Скачать приложение можно отсюда: market.android.com/details?id=vk.android.anekdot
Не забудьте оставить отзыв и оценку. Конечно же положительную!
Спасибо вам за внимание!
P.S. Следующее приложение будет обязательно с картами и GPS