2012-02-22 7 views
5

He registrado mi BroadcastReceiver en AndroidManifest.xml como estoCómo detener manualmente en BroadcastReceiver androide

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example" android:versionCode="1" android:versionName="1.0"> 
    <application android:icon="@drawable/icon" android:label="@string/app_name" 
    android:theme="@android:style/Theme.Light"> 
    <activity android:name=".WiFiDemo" android:label="@string/app_name"> 
     <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <receiver android:name="com.example.WiFiScanReceiver"> 
     <intent-filter> 
     <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" /> 
     </intent-filter> 
    </receiver> 
    </application> 
    <uses-sdk android:minSdkVersion="3" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> 
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"></uses-permission> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"> </uses-permission> 
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission> 
<uses-permission android:name="android.permission.INTERNET" /> 
</manifest> 

Quiero dejar este BroadcastReceiver usando otra entrada de la aplicación cómo detener este receptor mediante programación?

aquí es mi código del receptor:

public class WIFIBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction() 
       .equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 
      Intent ssIntent = new Intent(context, com.Activity.class); 
      ssIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      context.startActivity(ssIntent); 
     } 
    } 
} 

respuesta :: tengo añadir casilla sharedprefernce y guarde los dos cuerdas y validar en el método de recibir aquí es mi código

segunda aplicación :

final CheckBoxPreference checkboxPref = (CheckBoxPreference) getPreferenceManager() 
     .findPreference("checkboxPref"); 
// ... 
checkboxPref 
     .setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 

      public boolean onPreferenceChange(Preference preference, 
        Object newValue) { 
       if (newValue.toString().equals("true")) { 
        // String value = sp.getString(key, null); 
        sharedPreferences = getSharedPreferences(
          PREFS_READ, Context.MODE_WORLD_READABLE); 
        Editor prefsPrivateEditor = sharedPreferences.edit(); 
        prefsPrivateEditor.putString(KEY_READ1, "true"); 
        prefsPrivateEditor.commit(); 
        Toast.makeText(getApplicationContext(), 
          "CB: " + "true", Toast.LENGTH_SHORT).show(); 
       } else { 
        sharedPreferences = getSharedPreferences(
          PREFS_READ, Context.MODE_WORLD_READABLE); 
        Editor prefsPrivateEditor = sharedPreferences.edit(); 
        prefsPrivateEditor.putString(KEY_READ1, "false"); 
        prefsPrivateEditor.commit(); 
        Toast.makeText(getApplicationContext(), 
          "CB: " + "false", Toast.LENGTH_SHORT) 
          .show(); 
       } 
       return true; 
      } 
     }); 

código de validación en la primera aplicación dentro del método onReceive:

public class WIFIBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction() 
       .equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 
      sharedPreferences = otherAppsContext.getSharedPreferences(
        PREFS_READ, Context.MODE_WORLD_WRITEABLE); 
      String scaningAction = sharedPreferences.getString(KEY_READ1, null); 
      if (scaningAction.equals("true")) { 
       Intent ssIntent = new Intent(context, com.Activity.class); 
       ssIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       context.startActivity(ssIntent); 
      } 
     } 
    } 
} 

esta es mi necesidad. Pero no puedo anular el registro del receptor de difusión. sin actividad, esta respuesta será útil para alguien.

Respuesta

1

De esta manera:

PackageManager pm = getPackageManager(); 
pm.setComponentEnabledSetting(WiFiScanReceiver, 
          PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
          PackageManager.DONT_KILL_APP); 
+0

cómo crear WiFiScan Objeto del receptor? –

+0

Este es su receptor de radiodifusión que compila antes (en el código que adjuntó) – Jviaches

+0

No se olvide de habilitarlo de nuevo cuando la aplicación inicie una copia de seguridad o la recepción no se llame – tyczj

0

Sobre todo usted tiene que registrar su BroadcastReceiver en su método de onResume() ya que es el Running State de actividad. Y podemos anular el registro dentro del onPause() que es Stopped State de una Actividad. Puede leer más sobre él desde Broadcast Receivers

+0

no tengo clase de actividad ... tengo solo clase de receptor .. –

+1

puede mantener un booleano en SharedPreferences y verificar la condición dentro de onReceive() 'if (isTrue) {// execute receiver code}' –

+0

si true significa cómo anular el registro sin actividad? –

2

Puede utilizar esta:

ComponentName receiver = new ComponentName(context, myReceiver.class); 

PackageManager pm = context.getPackageManager(); 

pm.setComponentEnabledSetting(receiver, 
     PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
     PackageManager.DONT_KILL_APP) 

Para más información visite here.

0

Supongo que el código con la preferencia está en alguna actividad de preferencia. Así que deje su receptor como estaba al principio y usar algo como:

public class YourSettingsActivity extends PreferenceActivity { 

    OnPreferenceChangeListener onPreferenceChangeListener; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     onPreferenceChangeListener = new OnPreferenceChangeListener() { 

      public boolean onPreferenceChange(Preference preference, 
        Object newValue) { 
       if (newValue instanceof Boolean) { 
        final boolean enable = (Boolean) newValue; 
        PackageManager pacman = getPackageManager(); 
        final ComponentName componentName = new ComponentName(
          "com.example.yourapp1", WIFIBroadcastReceiver.class); 
        final int state = (enable) ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED 
          : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; 
        pacman.setComponentEnabledSetting(componentName, state, 
          PackageManager.DONT_KILL_APP); 
        Toast.makeText(getApplicationContext(), "CB: " + enable, 
          Toast.LENGTH_SHORT).show(); 
        return true; 
       } 
       return false; 
      } 
     }; 
     @SuppressWarnings("deprecation") 
     final CheckBoxPreference checkboxPref = (CheckBoxPreference) getPreferenceManager() 
       .findPreference("checkboxPref"); 
     checkboxPref.setOnPreferenceChangeListener(onPreferenceChangeListener); 
    } 
} 

Probablemente se encontrará con las excepciones de seguridad - ver here de permisos y agregó:

<!-- Allows an application to change whether an application component (other than 
     its own) is enabled or not. --> 
<permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" 
    android:label="@string/permlab_changeComponentState" 
    android:description="@string/permdesc_changeComponentState" 
    android:protectionLevel="signatureOrSystem" /> 

también tendrá que tener cuidado en la línea de :

final ComponentName componentName = new ComponentName(
          "com.example.yourapp1", WIFIBroadcastReceiver.class); 

segundo palo si esto lo resolvió