Статья, связанная с ответом Йенса на этот же вопрос, дает отличную презентацию на эту тему.Я использовал это, чтобы реализовать решение, которое работало на меня.
Ключевым моментом является то, что ваш 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 (), чтобы увидеть, была ли кнопка питания конкретной причиной вызова этих методов.