Благодаря Quick Setting Tiles пользователи Android получают быстрый доступ к важным системным приложениям и настройкам с помощью простого свайпа и последующего клика. На этих плитках (tiles) размещается ряд системных настроек, в том числе Wi-Fi, Bluetooth, передача геогеоданных и тип ориентации устройства в пространстве, но до сих пор для несистемных приложений доступ туда был закрыт. Однако, всё изменилось с выходом Android Nougat и API-интерфейса Quick Settings Tile, который позволяет любому разработчику добавлять туда собственные настройки с помощью всего лишь нескольких строк кода. Эти новые API-интерфейсы, добавленные в последней версии Xamarin.Android, теперь доступны в рамках Cycle 8 Service Release 1.
Добавление Tile Service
Quick Setting Tiles полностью управляются новой службой Android, под названием TileService, которая может быть выполнена без запуска приложения. Мы можем создать собственную TileService, унаследовав её, как только компиляционные и целевые API-интерфейсы будут установлены в 24 (Android Nougat):
1 2 3 4 5 6 7 8 9 10 | using Android.App; using Android.Graphics.Drawables; using Android.Service.QuickSettings; using Android.Views; using Java.Lang; public class GetMonkeyService : TileService { } |
Параметры Manifest
Наследования и создания TileService недостаточно для того, чтобы Quick Setting Tile были показаны, поскольку нам ещё нужно указать для нового сервиса конкретные метаданные и интент-фильтры. Это может быть достигнуто путём размещения нескольких атрибутов поверх класса, который мы только что создали:
1 2 3 4 5 6 7 8 9 | [Service(Name = "com.refractored.monkeysapp.GetMonkeyService", Permission = Android.Manifest.Permission.BindQuickSettingsTile, Label = "@string/tile_name", Icon = "@drawable/ic_tile_default")] [IntentFilter(new[] { ActionQsTile })] public class GetMonkeyService : TileService { } |
Подпись и иконка сервиса будут отображаться в области быстрых настроек, поэтому не забудьте внести эту специфику в приложение. За счёт этого кода плитка начнёт отображаться, и пользователь сможет добавить её к быстрым настройкам.
События быстрых настоек
У этой плитки теперь есть четыре чрезвычайно важных события, на которые она может реагировать: добавление её или удаление, а также моменты, когда она демонстрируется и когда она, наоборот, не показывается. Каждое из этих событий подвергается действию с помощью простого переопределения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //First time tile is added to quick settings public override void OnTileAdded() { base.OnTileAdded(); } //Called each time tile is visible public override void OnStartListening() { base.OnStartListening(); } //Called when tile is no longer visible public override void OnStopListening() { base.OnStopListening(); } //Called when tile is removed by the user public override void OnTileRemoved() { base.OnTileRemoved(); } |
Обновление Quick Setting Tiles
После того как плитка будет добавлена, сервис начнёт получать OnStartListening каждый раз, когда пользователь сделает скользящие движение сверху вниз, открывая меню быстрых настроек. Это дает нам возможность обновить плитку дополнительной информацией. Мы можем обновить плитку, получив ссылку на QsTile, а затем осуществив изменения свойств и применения Update(), например так, как показано далее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public override void OnStartListening() { base.OnStartListening(); //Tile associated with the service var tile = QsTile; //Update label, icon, description, and state tile.Icon = Icon.CreateWithResource(this, Resource.Drawable.ic_tile_default); tile.Label = GetString(Resource.String.tile_name); //Set state here and UI will respond automatically tile.State = TileState.Active; tile.UpdateTile(); } |
Ответ на клик по плитке
Теперь настало время для реализации действительного реагирования при нажатии на нашу воображаемую новую плитку. Это делается с помощью другого метода, который мы можем переопределять, и он получил говорящие название OnClick. Когда плитка нажата, мы можем сделать одну из трех вещей:
- Запустить фоновую службу для обработки информации
- Открыть диалоговое окно, если пользователь нуждается в большем количестве контекстных действий
- Запустить Activity
В этом примере мы откроем новый диалог, в котором появится очаровательная обезьяна. Важно помнить, что наша плитка может быть видимой даже в том случае, если телефон заблокирован, поэтому мы должны подсказать пользователю сперва снять блокировку перед тем, как её открывать.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public override void OnClick() { base.OnClick(); if (IsLocked) { //Open Dialog is unavailable here //Option 1: Kick of background service //Option 2: Prompt user to unlock UnlockAndRun(new Runnable(() => { //Show Dialog when unlocked ShowDialog(MonkeyDialog); })); } else { //Show Dialog ShowDialog(MonkeyDialog); } //Additionally, update tile if needed here. } |
В заключение
Вы можете получить полный исходный код проекта Monkeys App на GitHub или же просто скачать приложение с Google Play. Обязательно загляните в документацию нового API-интерфейса Tile.
Автор: James Montemagno
Источник: Официальный блог Xamarin
Написать ответ