Intereting Posts
Глубокая привязка Android к приложению Тестирование RxJava2 с использованием Espresso и получение исключения нулевого указателя, когда suscribeOn Ошибка: ресурс не найден, который соответствует указанному имени (в 'теме' со значением '@ style / AppTheme') Вызовите базу данных Firebase из Google App Engine Почему изображение, захваченное с использованием намерения камеры, вращается на некоторых устройствах на Android? Переход общего элемента с помощью операции «Диалог» Proguard – AppCompat не поддерживает текущие функции темы после proguard / minify Как узнать, является ли этот поток потоком пользовательского интерфейса Как создать собственные компоненты для Android и использовать их из библиотеки jar? Не удалось подключить Android ADB через TCP / IP Значок закладки не отображается. Аутентификация веб-API ASP.NET Быстрое распознавание и отслеживание объектов в Android Что означает публикация сообщения об ошибке Google Play APK? VectorDrawable: Android загружает xhdpi PNG вместо векторного ресурса

Android – как получить трансляцию намерений ACTION_SCREEN_ON / OFF?

<application> <receiver android:name=".MyBroadcastReceiver" android:enabled="true"> <intent-filter> <action android:name="android.intent.action.ACTION_SCREEN_ON"></action> <action android:name="android.intent.action.ACTION_SCREEN_OFF"></action> </intent-filter> </receiver> ... </application> 

MyBroadcastReceiver установлен только для того, чтобы MyBroadcastReceiver foo на журналы. Ничего не делает. Любые предложения, пожалуйста? Нужно ли мне назначать какие-либо разрешения, чтобы поймать намерение?

Solutions Collecting From Web of "Android – как получить трансляцию намерений ACTION_SCREEN_ON / OFF?"

Я считаю, что эти действия могут быть получены только получателями, зарегистрированными в Java-коде (через registerReceiver() ), а не через получатели, зарегистрированные в манифесте.

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

 @Override protected void onPause() { super.onPause(); // If the screen is off then the device has been locked PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); boolean isScreenOn; if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { isScreenOn = powerManager.isInteractive(); } else { isScreenOn = powerManager.isScreenOn(); } if (!isScreenOn) { // The screen has been locked // do stuff... } } 
 "android.intent.action.HEADSET_PLUG" "android.intent.action.ACTION_SCREEN_ON" "android.intent.action.ACTION_SCREEN_OFF" 

Три из них выше, они не могут зарегистрироваться с помощью манифеста. Ядро Android добавило к ним «Intent.FLAG_RECEIVER_REGISTERED_ONLY» (возможно .. Я проверил коды только в случае «HEADSET_PLUG».

Итак, мы должны использовать «динамический регистр». Как ниже …

 private BroadcastReceiver mPowerKeyReceiver = null; private void registBroadcastReceiver() { final IntentFilter theFilter = new IntentFilter(); /** System Defined Broadcast */ theFilter.addAction(Intent.ACTION_SCREEN_ON); theFilter.addAction(Intent.ACTION_SCREEN_OFF); mPowerKeyReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String strAction = intent.getAction(); if (strAction.equals(Intent.ACTION_SCREEN_OFF) || strAction.equals(Intent.ACTION_SCREEN_ON)) { // > Your playground~! } } }; getApplicationContext().registerReceiver(mPowerKeyReceiver, theFilter); } private void unregisterReceiver() { int apiLevel = Build.VERSION.SDK_INT; if (apiLevel >= 7) { try { getApplicationContext().unregisterReceiver(mPowerKeyReceiver); } catch (IllegalArgumentException e) { mPowerKeyReceiver = null; } } else { getApplicationContext().unregisterReceiver(mPowerKeyReceiver); mPowerKeyReceiver = null; } } 

Способ, которым я это реализовал, – зарегистрировать получателя в моей основной деятельности в onCreate (), просто определить приемник где-то заранее:

  lockScreenReceiver = new LockScreenReceiver(); IntentFilter lockFilter = new IntentFilter(); lockFilter.addAction(Intent.ACTION_SCREEN_ON); lockFilter.addAction(Intent.ACTION_SCREEN_OFF); lockFilter.addAction(Intent.ACTION_USER_PRESENT); registerReceiver(lockScreenReceiver, lockFilter); 

И затем onDestroy ():

  unregisterReceiver(lockScreenReceiver); 

В приемнике вы должны поймать следующие случаи:

 public class LockScreenReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent != null && intent.getAction() != null) { if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { // Screen is on but not unlocked (if any locking mechanism present) } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { // Screen is locked } else if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) { // Screen is unlocked } } } }