Я работаю над приложением 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
, но у меня все еще такое же поведение.