Android: широковещательный приемник для включения и выключения экрана - PullRequest
58 голосов
/ 28 февраля 2012

Мне было просто интересно, можно ли зарегистрировать приемник вещания, который обнаруживает включение / выключение экрана в манифесте приложения. Причина, по которой мне не нравится программируемый метод, состоит в том, что он требует, чтобы приложение было запущено, чтобы обнаружить такую ​​вещь, в то время как: «Приложения с зарегистрированными в манифесте широковещательными получателями не должны запускаться, когда намерение транслируется для выполнения получателями» (источник: книга «Разработка приложений для профессиональных Android 2»)

Мое приложение на самом деле является приложением блокировки экрана, которое при использовании программируемого способа должно работать постоянно: S

Есть ли способ обойти это?

Я пробую в манифесте следующее:

<receiver android:name=".MyBroadCastReciever">
    <intent-filter>
        <action android:name="android.intent.action.SCREEN_OFF"/>
        <action android:name="android.intent.action.SCREEN_ON"/>
    </intent-filter>
</receiver>

и простой класс MyBroadCastReciever:

public class MyBroadCastReciever extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            Log.i("Check","Screen went OFF");
            Toast.makeText(context, "screen OFF",Toast.LENGTH_LONG).show();
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            Log.i("Check","Screen went ON");
            Toast.makeText(context, "screen ON",Toast.LENGTH_LONG).show();
        }
    }
}

Ответы [ 2 ]

77 голосов
/ 28 февраля 2012

Два действия для включения и выключения экрана:

android.intent.action.SCREEN_OFF
android.intent.action.SCREEN_ON

Но если вы зарегистрируете получателя для этих трансляций в манифесте, то получатель не получит эти трансляции.

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

PS: запустить службу на переднем плане, чтобы она работала дольше.

Простой фрагмент кода будет выглядеть примерно так:

IntentFilter screenStateFilter = new IntentFilter();
screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(mScreenStateReceiver, screenStateFilter);

Не забудьте отменить регистрацию получателя в Сервисе onDestroy :

unregisterReceiver(mScreenStateReceiver);

На всякий случай для людей, которые спрашивают, почему получатель не работает с объявлением трансляций в манифесте для ACTION_SCREEN_ON и ACTION_SCREEN_OFF:

https://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_ON https://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_OFF

Вы не можете получить это только через компоненты, объявленные в манифестах явно зарегистрировавшись для этого с Context.registerReceiver ().

Это защищенное намерение, которое может быть отправлено только системой.

0 голосов
/ 02 июля 2014

Вам необходимо создать фоновый сервис, чтобы проверить это. Затем вы можете установить его программно.

...