Разбудить Android Wear из службы в спящем режиме?

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

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

Уведомление создается и отображается из службы WearableListenerService. Я пробовал много решений, таких как блокировка пробуждения. Код написан на C# с Xamarin.Android, но я думаю, что любой Java-разработчик также сможет прочитать:

static PowerManager.WakeLock sWakeLock;
static object LOCK = new object();

void DisplayNotification()
{
    //create the wake lock
    lock (LOCK)
    {
        if (sWakeLock == null)
        {
            // This is called from BroadcastReceiver, there is no init.
            var pm = (PowerManager)GetSystemService(Context.PowerService));
            sWakeLock = pm.NewWakeLock(
            WakeLockFlags.ScreenBright | WakeLockFlags.Full | WakeLockFlags.AcquireCausesWakeup, "My WakeLock Tag");
        }
    }

    sWakeLock.Acquire();

    //display the notification
    //....

    //release the wake lock
    lock (LOCK)
        {
            //Sanity check for null as this is a public method
            if (sWakeLock != null)
                sWakeLock.Release();
        }   

}

Моя проблема в том, что часы проснутся в какой-то момент (через несколько минут), но не сразу по запросу. Пробовал поставить задержку на снятие wake lock или сделать sWakeLock.Acquire(2000) для того, чтобы wake lock автоматически снимался через 2 сек. Затем я также пробовал другие решения с WakefulBroadcastReceiver и AlarmManager, но у меня все еще такое же поведение.


person nicolas    schedule 24.11.2014    source источник


Ответы (2)


Я сделал что-то подобное на мобильном телефоне, просто добавив одну строку в onCreate активности, которую я вызывал службой.

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //add this below getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); }

person Maciek Kwapinski    schedule 04.04.2015

Я бы избегал Xamarin for Wear, поскольку он может вызвать некоторые конфликты и не работать должным образом, поскольку он не предназначен для этого.

Кроме того, если вы создали службу, которая запускается на Android Wear - я бы сказал, что Message API это правильный способ сделать это, у вас не должно возникнуть проблем с созданием уведомления (на самих часах) с вибрацией (без необходимости касания экрана) и уведомлением об обновлении. из вашего Сервиса - для обновления значения таймера.

Блокировки пробуждения не нужны.

Может помочь: Как я могу создать уведомление отличается на устройстве и на ношении?

person Michał Tajchert    schedule 25.11.2014
comment
Ваш ответ не очень полезен. Спасибо, но я знаю, как отображать уведомления на часах. Мое приложение работает отлично, когда часы включены. У меня такой глюк при выключенных часах. Это может быть проблема совместимости с Xamarin Android, но я видел, что у некоторых есть аналогичные проблемы с Java SDK. - person nicolas; 25.11.2014