- PVSM.RU - https://www.pvsm.ru -
Для большого количества приложений разработчики отдельно отмечают в особенностях возможность отображения на экране состояние устройства, а точнее — состояние аккумулятора и статус bluetooth-соединения со смартфоном.
Но не всегда значки батарейки и bluetooth органично вписываются в оформление приложения, да и имеет ли смысл занимать пространство информацией, которая требуется пару раз в сутки?
Ниже, как смотреть информацию о заряде и уведомление о потере соединения без дополнительных усилий и не прекращая работы (условно) любимого ватчфейса. А заодно о том, как работают в Pebble фоновые приложения.
Получается, что без использования приложения-компаньона необходимо реализовать следующую схему:
Pebble SDK предоставляет такую возможность через Background Worker API [1] [1]: механизм создания и управления вторым экземпляром приложения с ограниченной функциональностью — сбор показаний датчиков и выполнения задач не требующих пользовательского интерфейса.
Что же представляет из себя Worker, немного из документации:
Разработчики предлагают три способа получения данных из фонового приложения:
Основное приложение может управлять фоновым процессом[2] [2]:
Для создания шаблона приложения, используется ключ --worker:
$ pebble new-project --worker project_name
На одном уровне с каталогом src, создается каталог worker_src, в котором будет исходный код фонового процесса. Кода немного, поэтому привожу его целиком:
#include <pebble_worker.h>
#define WORKER_DUMMY 0
#define WORKER_WRIST 1
#define WORKER_BT 2
#define PERSIST_KEY 99
static void tap_handler(AccelAxisType axis, int32_t direction) {
persist_write_int(PERSIST_KEY, WORKER_WRIST);
worker_launch_app();
}
static void bt_handler(bool connected) {
persist_write_int(PERSIST_KEY, WORKER_BT);
worker_launch_app();
}
static void worker_init() {
accel_tap_service_subscribe(tap_handler);
bluetooth_connection_service_subscribe(bt_handler);
}
static void worker_deinit() {
accel_tap_service_unsubscribe();
bluetooth_connection_service_unsubscribe();
}
int main(void) {
worker_init();
worker_event_loop();
worker_deinit();
}
Подписываемся на два события: смену статуса bluetooth и на определение жеста рукой.
В зависимости от события в хранилище записывается соответствующий флаг и запускается основное приложение.
При инициализации приложения проверяем запущен ли Worker, если нет, то делаем попытку запустить в фоне:
bool running = app_worker_is_running();
if (!running) {
app_worker_launch();
};
Проверяем, каким образом было запущено приложение [3] [3], если не из фонового, то закрываем приложение, в противном случае запускаем таймер (сколько миллисекунд отображается уведомление) и закрываем:
AppLaunchReason app_reason = launch_reason();
if (app_reason == APP_LAUNCH_WORKER) {
app_timer = app_timer_register(ALERT_TIME*1000, close_app, NULL);
} else {
close_app();
};
Для «программного» выхода из приложения используется небольшой трюк:
static void close_app() {
window_stack_pop_all(animated);
}
Для отображения уведомлений создаем слой и задаем колбэк для отрисовки контекста:
layer_set_update_proc(layer, update_layer);
В обработчике читаем флаг из persistent storage и рисуем соответствующую картинку:
static void update_layer(Layer *layer, GContext *ctx) {
if (persist_exists(PERSIST_KEY)) {
int worker_event = persist_read_int(PERSIST_KEY);
switch (worker_event) {
case WORKER_WRIST:
battery_state(ctx);
break;
case WORKER_BT:
bluetooth_state(ctx);
break;
};
} else {
close_app();
};
}
Получилось приложение:
Исходники: bitbucket/pebble-device-status [4]
Pebble App Store: Device status [5]
1. Pebble Developers // Implementing the Background Worker [6]
2. Pebble Developers // AppWorker [7]
3. Pebble Developers // Launch Reason [8]
Автор: tmnhy
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/tutorial/85993
Ссылки в тексте:
[1] [1]: #Anchor1
[2] [2]: #Anchor2
[3] [3]: #Anchor3
[4] bitbucket/pebble-device-status: https://bitbucket.org/tmnhy/pebble-device-status/src
[5] Device status: https://apps.getpebble.com/applications/5506e53bed40850ea3000015
[6] 1. Pebble Developers // Implementing the Background Worker: http://developer.getpebble.com/guides/pebble-apps/app-structure/background-guide/
[7] 2. Pebble Developers // AppWorker: http://developer.getpebble.com/docs/c/Foundation/AppWorker/
[8] 3. Pebble Developers // Launch Reason: http://developer.getpebble.com/docs/c/Foundation/Launch_Reason/
[9] Источник: http://habrahabr.ru/post/253221/
Нажмите здесь для печати.