studio start sendbroadcast registerreceiver oreo example ejemplo connectivity_change android broadcast

start - Android: ¿cómo recibir las intenciones de transmisión ACTION_SCREEN_ON/OFF?



sendbroadcast android example (4)

<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 está configurado para escupir foo a los registros. No hace nada. Alguna sugerencia por favor? ¿Debo asignar algún permiso para captar el intento?


Alternativamente, puede usar el administrador de energía para detectar bloqueo de pantalla.

@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... } }


Creo que esas acciones solo pueden ser recibidas por los receptores registrados en código Java (a través de registerReceiver() ) en lugar de a través de receptores registrados en el manifiesto.


La forma en que implementé esto es registrando el receptor en mi actividad principal en onCreate (), simplemente defina el receptor en alguna parte de antemano:

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);

Y luego en Destroy ():

unregisterReceiver(lockScreenReceiver);

En el receptor debes atrapar los siguientes casos:

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 } } } }


"android.intent.action.HEADSET_PLUG" "android.intent.action.ACTION_SCREEN_ON" "android.intent.action.ACTION_SCREEN_OFF"

Tres de ellos arriba, No pueden registrarse usando Manifiesto. El núcleo de Android agregó "Intent.FLAG_RECEIVER_REGISTERED_ONLY" para ellos (tal vez ... revisé los códigos solo en caso de "HEADSET_PLUG").

Entonces, debemos usar "registro dinámico". Como abajo...

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; } }