tutorial start sendbroadcast registerreceiver oreo example connectivity_change android broadcastreceiver

sendbroadcast - start broadcast receiver android



Habilitar y deshabilitar un receptor de difusión (2)

Intento habilitar y deshabilitar un receptor de difusión utilizando este método PackageManager:

setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

El receptor de difusión está registrado en el manifiesto. El receptor funciona bien, pero cuando intento desactivarlo, todavía recibe los mensajes de difusión. Cuando desactivo el receptor en el manifiesto por "android: enabled =" false "", el receptor no recibe nada pero no puedo habilitarlo.

Llamo al método desde dentro de un servicio.

PackageManager pm = getApplicationContext().getPackageManager(); ComponentName componentName = new ComponentName("com.app", ".broadcast_receivers.OnNetworkChangedReceiver"); pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

Android manifiesto:

<receiver android:name=".broadcast_receivers.OnNetworkChangedReceiver" android:enabled="true"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver>

El receptor

public class OnNetworkChangedReceiver extends BroadcastReceiver { private static final String TAG = "OnNetworkChangedReceiver"; @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "in OnNetworkChanged"); } }

También llamé al método desde el interior de una Actividad ayer. Pensé que funcionaba, pero hoy ya nada funciona. ¿Podría ser que a veces hay una gran demora en la intención (android.net.conn.CONNECTIVITY_CHANGE) que malinterpreté ayer como desactivando el receptor?

¿El enfoque con el PackageManager es la dirección correcta o hay un error básico en la idea?

Muchas gracias, Sven


Bueno, lo que tienes básicamente parece estar bien. Tengo el siguiente código en uno de mis proyectos :

boolean enabled=prefs.getBoolean(key, false); int flag=(enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED); ComponentName component=new ComponentName(EditPreferences.this, OnBootReceiver.class); getPackageManager() .setComponentEnabledSetting(component, flag, PackageManager.DONT_KILL_APP);

Lo uso para desactivar un receptor BOOT_COMPLETED cuando no tengo ninguna alarma activa que deba programarse.

Supongo que su ComponentName no está configurado correctamente (por ejemplo, su líder). Pruebe el constructor que estoy usando, que toma un Context y una Class como parámetros.


Creo que usar PackageManager es pensar demasiado en tu situación. Usted tiene un BroadcastReceiver que a veces necesita ignorar las transmisiones que está escuchando. Puedo pensar en dos maneras fáciles de hacer esto:

1) Establezca un indicador que su receptor pueda verificar para ignorar o aceptar transmisiones, y no se preocupe por habilitarlo / deshabilitarlo en absoluto.

2) Cree el BroadcastReceiver programáticamente (puede ser solo una clase interna, par), y regístrelo y anótelo como lo necesite en determinadas partes de su aplicación.

En general, he descubierto que definir BroadcastReceivers en código en lugar de XML me ha proporcionado mucha más flexibilidad y, en general, me resulta más fácil de administrar.