Пока Евгений Зобнин учит тебя защищать свой код от чужих глаз и шаловливых ручонок, я решил занять позицию хитрого разработчика, который всегда рад, скажем так, кое-чему поучиться у создателей снискавших определенную популярность приложений ;). В этой статье я расскажу, как я анализировал код чужих программ и нашел одну интересную недокументированную функцию для работы с виджетами приложений.
 

Виджет с настройкой при добавлении

Многие из нас видели экран с настройками, который появляется при добавлении виджета на экран устройства. Например, погодный виджет может спросить: «А для какого города показывать прогноз?» Таким образом можно очень гибко настроить несколько виджетов одного и того же приложения для отображения разной информации.

Чтобы сэкономить труд на рутинных операциях, Android Studio может за нас в пару кликов создать рабочую заготовку с настраиваемым виджетом. От нас требуется только проставить нужные галочки в очень информативном мастере. Запускается он так: New-Widget-AppWidget.

Простой мастер, все ясно без документации
Простой мастер, все ясно без документации

В результате его работы у нас в проекте появятся два новых класса, которые автоматически пропишутся в манифест:

<receiver android:name=".NewAppWidget">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
    </intent-filter>

    <meta-data
        android:name="android.appwidget.provider"
        android:resource="@xml/new_app_widget_info"/>
</receiver>

<activity android:name=".NewAppWidgetConfigureActivity">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
    </intent-filter>
</activity>

Первый класс отвечает за сам виджет, а второй представляет собой активность для его настройки, которая запускается как раз при его добавлении. Такую активность мы можем запускать в разные моменты, но будет не очень понятно, какой именно виджет сейчас настраивается. Так что момент самый удачный и лучше больше никаких мест для данной настройки не использовать. Этот пример создания виджета описан во всех уроках и доках. Код простой, и ты сам в нем разберешься. Меня же заинтересовала возможность выбора иконки приложения, реализованная через виджет. Такая функция реализована в приложении Wifi Analyzer.

Вот же виджет. Негусто, но все же выбор
Вот же виджет. Негусто, но все же выбор
Вот же виджет. Негусто, но все же выбор
Вот же виджет. Негусто, но все же выбор
Вот же виджет. Негусто, но все же выбор
 

Полезные и бесполезные виджеты

Поначалу я хотел просто рисовать иконку приложения в виджете. Это обосновано тем, что для добавления иконки на рабочий стол нужно добавить новое разрешение в манифест.

<uses-permission
    android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />

А так как пользователи не любят много полномочий у приложения и вдобавок при изменении разрешений в манифесте отключается механизм автообновления, то я старался сделать иконки через механизм виджетов. И как я ни упражнялся в дизайне, получить иконку один в один как оригинальная не выходило. Виной всему было непонимание работы системы. Виджет не предназначен для дублирования функциональности иконки, он может быть максимально на нее похож, но рисуются они по-разному, и на каждой прошивке свой лаунчер, рисующий рабочий стол с ярлыками и виджетами, как вздумается его разработчику.

Посмотрев чужое творчество, я поначалу был слегка обескуражен: у данного приложения виджет не имеет экрана настройки и всего лишь дублирует функциональность иконки, просто запуская приложение. На первый взгляд он совершенно бесполезен… Но когда я связался с авторами этого приложения, мне сказали, что виджет показывает количество непрочитанных писем. Такая функция есть в iOS.

На первый взгляд — ничего полезного... на второй, впрочем, чуть лучше
На первый взгляд — ничего полезного… на второй, впрочем, чуть лучше
На первый взгляд — ничего полезного... на второй, впрочем, чуть лучше
На первый взгляд — ничего полезного… на второй, впрочем, чуть лучше
На первый взгляд — ничего полезного… на второй, впрочем, чуть лучше

Правда, не совсем понятно, зачем крохотному виджету сделали возможность менять свой размер? Или почему не сделали настройку выбора почтового ящика при добавлении виджета, например?

Что-то тут не так
Что-то тут не так
 

Делаем иконки, как farproc

Раз не получилось сделать новую иконку через обычный виджет, нужно посмотреть, как поступают другие разработчики. В этом могут помочь разные инструменты, я обычно пользуюсь онлайн-декомпилятором или decompileandroid.com. Заглянув в манифест приложения Wifi Analyzer, я не нашел обычных описаний виджетов, как из примера выше. Но виджет-то был! И он как-то запускал экран с выбором иконки!

Методом глубокого поиска и научного тыка было установлено, что тут используется недокументированная функция. А в манифесте только и нужно, что добавить новую activity с особым фильтром:

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


Комментарии

Подпишитесь на ][, чтобы участвовать в обсуждении

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

Check Also

Уязвимость на странице авторизации Joomla позволяла узнать учетные данные администратора

Релиз Joomla 3.8 принес более 300 исправлений и улучшений, а также устранил две уязвимости…