android: широковещательный приемник для включения и выключения экрана
мне просто интересно, можно ли зарегистрировать широковещательный приемник, который обнаруживает включение/выключение экрана в манифесте приложения.
Причина, по которой мне не нравится программируемый метод, заключается в том, что он требует, чтобы приложение работало, чтобы обнаружить такую вещь, в то время как:
"Приложения с широковещательными приемниками, зарегистрированными в манифесте, не должны запускаться, когда намерение транслируется для выполнения приемников" (источник: профессиональная разработка приложений для Android 2 книга)
мое приложение на самом деле приложение lockscreen, которое с помощью программируемого способа должно быть запущено все время :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 ответов:
два действия для включения и выключения экрана:
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);не забудьте отменить регистрацию приемника в сервис ' s 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
вы не можете получить это через компоненты, объявленные в манифестах, только путем явной регистрации для него с контекстом.registerReceiver().
это защищенное намерение, которое может быть отправлено только система.
Comments