2012-02-22 12 views
5

Zarejestrowałem moim BroadcastReceiver w AndroidManifest.xml jak tenJak zatrzymać BroadcastReceiver ręcznie w android

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

chcę zatrzymać ten BroadcastReceiver stosując inne wejście aplikacji jak zatrzymać ten odbiornik programowo?

tutaj jest mój kod Odbiornik:

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

odpowiedzi :: muszę dodać pole sharedprefernce i zapisać dwa ciąg i walidacji w sprawie odbierania metodę Oto mój kod

druga aplikacja :

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

kod potwierdzający w pierwszej aplikacji wewnątrz onReceive metoda:

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

to jest moja potrzeba. Ale nie jestem w stanie wyrejestrować odbiornika. bez żadnej aktywności ta odpowiedź będzie pomocna dla kogoś.

Odpowiedz

1

Jak to:

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

jak stworzyć WiFiScan Obiekt odbiorcy? –

+0

To jest twój odbiornik do brodcastu, który budowałeś wcześniej (w kodzie, do którego się podłączasz) – Jviaches

+0

Nie zapomnij go włączyć, gdy aplikacja uruchomi się ponownie lub funkcja onReceive nie zostanie wywołana – tyczj

0

Głównie trzeba zarejestrować BroadCastReceiver w swojej metodzie onResume() jak to Running State działalności. I możemy wyrejestrować go wewnątrz onPause(), który jest Stopped State z Aktywności. Możesz przeczytać więcej o tym od Broadcast Receivers

+0

Nie mam klasy aktywności .. mam tylko klasę odbiornika .. –

+1

można zachować wartość boolowską w SharedPreferences i sprawdzić warunek wewnątrz onReceive() 'if (isTrue) {// wykonaj kod odbiorcy}' –

+0

, jeśli true oznacza, jak wyrejestrować bez aktywności? –

2

można użyć tego:

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

PackageManager pm = context.getPackageManager(); 

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

Więcej informacji można znaleźć here.

0

Zgaduję, że kod z preferencją jest w niektórych aktywności preferencji. Tak zostawić odbiornik jak to było pierwotnie i używać coś takiego:

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

Będziesz prawdopodobnie napotkasz wyjątkami bezpieczeństwa - patrz here za dodanie uprawnienia:

<!-- 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" /> 

również trzeba będzie uważać na linię :

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

post z powrotem jeśli to rozwiązać go

Powiązane problemy