Изменение цвета светодиодного уведомления каждые 5 секунд

#android

#Android

Вопрос:

Я пытаюсь включить светодиодное уведомление, например, зеленого цвета. Выключите экран и каждые 5 секунд меняйте этот цвет на красный (зеленый-> красный, красный-> зеленый). Я думаю, что я сделал все: в сервисе я создал таймер, который выполняет метод отображения уведомления.

 public class LEDService extends Service
{
private boolean TimerStarted;
private Timer timer;
private NotificationManager myNotificationManager;
private long LastColor;

public TurnLedOn()
{
     Notification notify = new Notification();
     notify.flags |= Notification.FLAG_SHOW_LIGHTS;
     notify.LedOnMS = 500;
     notify.LedOffMS = 0;
     //I in other example I also used array of colors
     if (LastColor == 0x00FF00) notify.LedARGB = 0xFF0000; else notify.LedARGB = 0x00FF00;         
     LastColor = notify.LedARGB;
}

private MyTimerTask extends TimerTask
{
    @Override
    public void run()
    {
        TurnLedOn();
    }
}

@Override
public void OnCreate()
{
    TimerStarted = false;
    myNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) 
{
    if (TimerStarted == false)
    {
        timer = new Timer();
        timer.schedule(new MyTimerTask(), 0, 5000);
    }        
    return START_STICKY;
}

@Override
public IBinder onBind()
{
    return null;
}

@Override
public void onDestroy()
{
    timer.close();
}
}
  

В чем проблема? Светодиод не меняет свой цвет… Когда я выключаю экран, цвет остается зеленым, пока я не включу экран и не выключу его снова. Я хочу запустить эту службу один раз, выключить экран и увидеть, как светодиод меняет цвет :).

Кстати: я протестировал свой телефон, и он может отображать зеленые и красные индикаторы, так что это не проблема.

Заранее благодарю и прошу прощения за мой английский.

Я не могу ответить на свой собственный вопрос, поэтому добавлю это здесь:

Спасибо за ваши предложения Olsavage, я добавил ClearAll() в свой код, но эффект все тот же;/. Я также добавил ведение журнала в свое приложение (Log.i() ). Похоже, что система останавливает мою службу, когда я выключаю экран (почему??). Это что-то вроде:

Экран включен: таймер запущен, и уведомление развернуто (но я не вижу светодиода, потому что для его просмотра мне нужно выключить экран: P)

Нажмите на кнопку блокировки: таймер почти остановлен, поэтому светодиод иногда меняет цвет один раз.

Экран выключен: таймер не работает, метод TurnLedOn больше не выполняется. Светодиод не меняет цвета.

Теперь вопрос: почему моя служба останавливается после выключения экрана? Даже когда я выполняю в нем простую операцию (например, увеличиваю переменную). Может быть, мне нужно установить его приоритет или что-то в этом роде?

Я изменил интервал таймера на 100 мс и вижу, что код исправен. Светодиод менял цвета 5-15 раз, но затем немедленно останавливался. Я знаю, что это приложение совершенно бесполезно, но я просто хочу, чтобы оно работало :).

РЕДАКТИРОВАНИЕ 2: я думаю, мне придется использовать AlarmManager и PendingIntent для запуска моей службы… Завтра я попытаюсь это сделать.

Ответ №1:

Хорошо, я думаю, что я понял это. Вообще убрал таймер. Вместо этого я использую AlarmManager :).

Я добавил в onCreate следующий код:

 alarmmgr = (AlarmManager) getSystemService(ALARM_SERVICE);
  

в onStartCommand:

 public int onStartCommand(Intent intent, int flags, int startId) 
{
 TurnLedOn();   //Turn LED On
 myPendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent. FLAG_UPDATE_CURRENT);   
 alarmmgr.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() 5000, myPendingIntent); //Setting alarm to be off after 5seconds.
 return Service.START_NOT_STICKY;
}
  

в onDestroy:

 public void onDestroy() 
{
notifymgr.cancel(LED_NOTIFICATION_ID);  //Clearing notification
alarmmgr.cancel(myPendingIntent);   //Clear alarm
}
  

Я думаю, что код в порядке, но я совершенно новичок в программировании на Android. Я думаю, что решил свою проблему.

Ответ №2:

Вам нужно использовать формат ARGB. Попробуйте установить 0xFFFF0000 — красный и 0xFF00FF00 — зеленый. Надеюсь, это поможет.

Хм, может быть, ваше старое уведомление не было очищено? Попробуйте использовать myNotificationManager.ClearAll(); Перед myNotificationManager.notify(0, уведомлять);

О, также попробуйте установить notify.ledOffMS = 5000;

Комментарии:

1. Он уже отображает правильный цвет 🙂 Проблема в том, что он не меняет цвет, когда экран выключен. Чтобы изменить цвет, я должен повернуть экран своего телефона и выключить его… Я хочу автоматически менять цвет.