Как остановить BroadcastReceiver вручную в Android - PullRequest
5 голосов
/ 22 февраля 2012

Я зарегистрировал свой BroadcastReceiver в AndroidManifest.xml как этот

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

Я хочу остановить это BroadcastReceiver, используя вход другого приложения, как программно остановить этот приемник?

Вот мой код получателя:

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

Ответ :: Я добавил флажок sharedprefernce, сохранил две строки и подтвердил метод приема. Вот мой код

второе приложение:

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

проверка кода в первом приложении внутри 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);
            }
        }
    }
}

это моя потребность.Но я не могу отменить регистрацию приемника вещания.без активности любой этот ответ будет полезен для кого-то.

Ответы [ 4 ]

2 голосов
/ 12 декабря 2012

Вы можете использовать это:

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

PackageManager pm = context.getPackageManager();

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

Для получения дополнительной информации посетите здесь .

1 голос
/ 22 февраля 2012

Как это:

PackageManager pm = getPackageManager();
pm.setComponentEnabledSetting(WiFiScanReceiver,
                            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                            PackageManager.DONT_KILL_APP);
0 голосов
/ 28 апреля 2013

Я предполагаю, что код с предпочтением находится в некотором предпочтительном действии. Так что оставьте свой приемник, как он был изначально и используйте что-то вроде:

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

Вы, вероятно, столкнетесь с исключениями безопасности - см. здесь для добавления разрешений:

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

Также вам нужно быть осторожным в строке:

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

Опубликовать обратно, если это решило

0 голосов
/ 22 февраля 2012

В основном вам необходимо зарегистрировать свой BroadCastReceiver в вашем методе onResume(), так как это Running State действия. И мы можем отменить его регистрацию внутри onPause(), что является Stopped State Деятельности. Вы можете прочитать больше об этом из Broadcast Receivers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...