Как остановить сервис, когда ACTION_SCREEN_OFF - PullRequest
3 голосов
/ 24 декабря 2010

Я пытаюсь остановить работу службы UpdateService для моего виджета цифровых часов, когда экран выключен для экономии заряда батареи, и затем снова включить, когда экран активирован.В настоящее время он есть в моем onReceive () в моем AppWidgetProvider, но я также пробовал его в BroadcastReciever.

Мой текущий код:

public static boolean wasScreenOn = true;

public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
    Log.d("Screen switched on. ", "Starting DigiClock UpdateService.");
    context.startService(new Intent(UpdateService2by2.ACTION_UPDATE));
    wasScreenOn = false;
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
    Log.d("Screen switched off. ", "Stopping DigiClock UpdateService.");
    context.stopService(new Intent(context, UpdateService2by2.class));
    wasScreenOn = true;
}

Может кто-нибудь помочь мне здесь?Я в тупике.

Ответы [ 4 ]

3 голосов
/ 24 декабря 2010

Я вполне уверен, что вы должны зарегистрировать свой приемник в коде ACTION_SCREEN_OFF/ONЯ не думаю, что регистрация их в манифесте будет работать.

1 голос
/ 01 апреля 2012

Статья, связанная с ответом Йенса на этот же вопрос, дает отличную презентацию на эту тему.Я использовал это, чтобы реализовать решение, которое работало на меня.

Ключевым моментом является то, что ваш BroadcastReceiver может быть зарегистрирован только в коде;Вы не хотите и не нуждаетесь в записи в своем манифесте.

Я рекомендую эту статью, но для тех, кто спешит, самый простой из возможных подходов к функционированию - просто вставить что-то подобное в метод onCreate () вашей деятельности:

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver screenoffReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
      Log.v("screenoffReceiver", "SCREEN OFF");
    }
    else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
      Log.v("screenoffReceiver", "SCREEN ON");
    }
    return;
  }
};      
registerReceiver(screenoffReceiver, filter);

Как указывается в статье, для запущенного действия onPause () / onResume () всегда вызывается, когда кнопка питания используется для очистки / разблокировки дисплея, поэтому, если у вас есть что-то, что выне возражайте против выполнения даже в тех случаях, когда кнопка включения была , а не причиной вызова onPause () или onResume (), вы можете сделать это в этих методах и, таким образом, перехватить каждый экземпляр мощностикнопка, используемая для очистки или разблокирования экрана (наряду с вызовами по другим причинам) без затрат на создание BroadcastReceiver.

Это был случай для меня;У меня была кнопка, которая делала основной вид моей деятельности невидимым при нажатии и видимым при отпускании, и если пользователь удерживал кнопку, а затем нажимал кнопку питания, когда приложение было скрыто, оно оставалось бы скрытым, когда экран был разблокирован другим пользователем.нажатие кнопки питания.Так что в моем случае мне нужно было только поместить вызов setVisibility (VISIBLE) для моего основного представления в переопределение onResume () моей деятельности.

Фактически, как показано в статье, даже если вы хотите только ответить наСобытия кнопки питания, правильный способ сделать это - установить флаг в BroadcastReceiver, а затем проверить этот флаг в onPause () и / или onResume (), чтобы увидеть, была ли кнопка питания конкретной причиной вызова этих методов.

1 голос
/ 15 апреля 2011

Кажется, вы не можете зарегистрироваться для намерений ACTION_SCREEN_ON / OFF с фильтром в манифесте. Вы должны зарегистрировать свой BroadcastReceiver в коде. См. здесь с примерами деятельности и услуги.

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

Чтобы обработать это намерение с помощью виджета, я думаю, что вам нужно запустить службу, которая прослушивает намерение и затем уведомляет ваш виджет.

0 голосов
/ 24 марта 2011

Возможно, вам следует использовать

public class MyReceiver extends BroadcastReceiver {..}

, а затем использовать это имя класса в манифесте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...