2016-08-30 7 views
0

Я создаю приложение Android для управления розетками с помощью смартфона. Приложение имеет приложение Android Wear, чтобы люди могли контролировать свои огни прямо с запястья.Wear Actions выполняется очень медленно или совсем не работает, когда телефон находится в режиме доз

Когда пользователь хочет контролировать свет я отправить действие Строки через MessageApi из SmartWatch на смартфон, который принимает это действие в WearableListenerService и посылает соответствующий сигнал сети к электрической розетке/шлюзу в AsyncTask.

Это работает нормально, пока телефон не был в режиме ожидания слишком долго. Однако, если телефон по-прежнему находится на столе слишком долго, а дремоты в действиях Wear выполняются очень медленно, а иногда и вовсе. Я предполагаю, что это частично связано с поведением, но в моем случае это нецелесообразно, так как пользователь не может ждать, пока его свет загорится, если он захочет войти в темную комнату.

Я знаю, что доза полностью сокращает сетевое взаимодействие для всего, кроме FCM/GCM, если вы не находитесь в белом списке доз. Но даже когда мое приложение включено в этот белый список, а сетевая часть работает, может потребоваться много времени для выполнения на телефоне.

Так что мой конкретный вопрос: Каков рекомендуемый способ справиться с этим сценарием, когда действие с переносимого устройства должно выполняться через сеть на подключенном смартфоне, находящемся в режиме доз?

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

Я знаю, что у AlarmManager есть новый метод, который работает даже в режиме доз, но это также исправит задержку обработки? Увольнение тревоги после получения MessageEvent от MessagApi кажется обходным путем для меня.

Или, может быть, AsyncTask - это неправильный способ обработки фоновой сети, и откуда происходит задержка?

+0

Возникла ли сообщение API 'onMessageReceived', когда телефон находится в состоянии Doze? Или это то, что задерживается? – String

+0

Теперь я изменил свой сетевой код, чтобы использовать IntentService для такого рода действий, и кажется, что он немного улучшил ситуацию. @String Да onMessageReceived немедленно срабатывает (почти). Я могу контролировать свои огни, когда в дозе. В моем коде я решаю между использованием WAN или LAN/WLAN, когда доступен интернет. Эта проверка (доступна в Интернете), кажется, занимает довольно много времени, и проверка не удалась, хотя мое приложение включено в белый список, и Интернет должен быть доступен. –

ответ

0

На самом деле есть несколько вариантов, которые вы можете использовать для обработки эффектов Doze, как указано в Adapting your app to Doze. Вы можете рассмотреть следующие варианты:

  1. Если ваше приложение требует постоянного подключения к сети, чтобы получать сообщения, вы должны использовать Google Cloud Messaging (GCM), если это возможно.

    GCM оптимизирован для работы с режимами ожидания Doze и App Standby с помощью высокоприоритетных сообщений GCM. Высокоприоритетные сообщения GCM позволяют надежно разбудить ваше приложение для доступа к сети, даже если устройство пользователя находится в режиме «Доза» или приложение находится в режиме ожидания приложения.

  2. Чтобы помочь с планированием аварийных сигналов, Android 6.0 (API-уровень 23) вводит два новых метода AlarmManager: setAndAllowWhileIdle() и setExactAndAllowWhileIdle(). С помощью этих методов вы можете установить аварийные сигналы, которые будут срабатывать, даже если устройство находится в режиме Doze.

    Однако обратите внимание, что при использовании этих методов ни setAndAllowWhileIdle(), ни setExactAndAllowWhileIdle() не могут подавать сигналы тревоги более одного раза в 9 минут за приложение.

Для получения более подробной информации или обсуждения попробуйте пройти через Optimizing for Doze and App Standby.

В дополнение к этим документам были также предоставлены и обсуждены те же варианты обработки Doze, которые обсуждались в Diving into Doze Mode for Developers, что также может помочь.

+0

Мне нужно подключение к Интернету (или по крайней мере lan), но не к серверу, который я могу контролировать, поэтому GCM не является вариантом (если я правильно понимаю). Я знаю о новых методах тревоги, и я их уже использую. Они работают правильно. Вы предполагаете, что это правильный способ справиться с этим? Выключить дополнительный сигнал? –