如何在安卓系统中手动停止广播接收器

5

我已经像这样在AndroidManifest.xml中注册了我的BroadcastReceiver

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

答案:: 我已经添加了共享首选项复选框,并在onReceive方法中保存两个字符串并进行验证,以下是我的代码:

第二个应用程序:

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个回答

3
您可以使用这个:
ComponentName receiver = new ComponentName(context, myReceiver.class);

PackageManager pm = context.getPackageManager();

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

欲了解更多信息,请访问此处


2

就像这样:

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

如何创建WiFiScanReceiver对象? - Gurumoorthy Arumugam
这是你之前构建的广播接收器(在你附加的代码中)。 - Jviaches
当应用程序重新启动或onReceive不会被调用时,请不要忘记再次启用它。 - tyczj

0

我猜偏好设置相关的代码在某个偏好设置活动中。所以保留你的接收器原样,并使用类似以下的内容:

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
通常情况下,您需要在onResume()方法中注册您的BroadCastReceiver,因为它是Activity的Running State。我们可以在Activity的Stopped StateonPause()中取消注册。您可以从Broadcast Receivers了解更多相关信息。

1
你可以在SharedPreferences中保存一个布尔值,并在onReceive()方法中检查条件。如果(isTrue){ // 执行接收器代码} - Lalit Poptani
如果为真,意味着如何在没有活动的情况下注销? - Gurumoorthy Arumugam
这意味着当您想要注销BroadCastReceiver时,可以在SharedPreference布尔变量中分配false,因此onReceive()内部的代码将不会执行。 - Lalit Poptani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接