Не удается выполнить действие по блокировке / выключению экрана с помощью onPause - PullRequest
1 голос
/ 02 мая 2020

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

public class ScreenAction extends BroadcastReceiver {
public static boolean wasScreenOn = true;

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
        // DO WHATEVER YOU NEED TO DO HERE
        wasScreenOn = false;
    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
        // AND DO WHATEVER YOU NEED TO DO HERE
        wasScreenOn = true;
    }
}

}

Затем, в моих основных действиях по созданию, у меня есть это

    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    BroadcastReceiver mReceiver = new ScreenAction();
    registerReceiver(mReceiver, filter);

В моих основных действиях наPause у меня есть что-то вроде этого:

 public void onPause() {
    super.onPause();
    if (ScreenAction.wasScreenOn) {
        final MediaPlayer mp = MediaPlayer.create(this, R.raw.pcmouseclick1);
        mp.setVolume(.1f, .1f);
        mp.start();
        if (buttonState) {
            mServ.reduceVolume();
        }
    }
}

Я нашел это из онлайн-источника, но у меня проблемы. Кажется, что состояние экрана всегда установлено как истинное, и я не уверен, как это изменить.

Как использовать этот класс ScreenAction, чтобы отключить музыку c при включении только паузы, когда пользователь заблокировал экран? Мне кажется, что я что-то упускаю в onPause, потому что в onCreate я ссылаюсь на класс.

Ответы [ 3 ]

0 голосов
/ 02 мая 2020

Может быть, вы также можете запускать и останавливать музыку c прямо из ресивера:

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
        // Pause music player
    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
        // Resume music player
    }
}
0 голосов
/ 02 мая 2020

Вы проверяете ScreenAction.wasScreenOn в onPause, но это происходит до того, как вызывается BroadcastReceiver, чтобы уведомить вас о том, что экран выключен. Таким образом, в этот момент ScreenAction.wasScreenOn по-прежнему имеет значение true, а затем установлено значение false, но onPause уже запущен, поэтому ваша музыка c никогда не останавливается.

Чтобы решить эту проблему, вы должны принять действие непосредственно в ответ на выключение экрана в BroadcastReceiver. Если вам нужно взаимодействовать с вашим пользовательским интерфейсом, рассмотрите решение, такое как LiveData, в качестве абстракции, чтобы вы не зависели от приостановки вашей активности в тот момент, когда экран выключен (учтите также, что решение onPause не будет работать, если ваша активность в данный момент не видна).

0 голосов
/ 02 мая 2020
@Override
protected void onPause() {
    // when the screen is about to turn off
    // or when user is switching to another application

    super.onPause();
}

@Override
protected void onResume() {
    // only when screen turns on
    // or when user returns to application


    super.onResume();
}

Здесь вы можете увидеть весь жизненный цикл действия в android: Жизненный цикл активности

...