简体   繁体   中英

How to unregister a broadcast receiver in Android

I've created a basic wifi widget. The only problem is that it keeps listening for wifi changes even after I've removed/deleted the widget from the screen. How do I stop that without a force close/crash (guessing unregister reciever) or am I using the Broadcast Receiver wrong?

    public class WifiWidget extends AppWidgetProvider {

  WifiManager wifi;
  ConnectivityManager mgr;
  //as of 6-28 12:38am working well except when deleting widget = force close

  public void onCreate(Context context) {
      IntentFilter mFilter = new IntentFilter();
      mFilter .addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
      context.registerReceiver(WifiRec, mFilter );
     }
  @Override
  public void onEnabled(Context context){
      context.getApplicationContext().registerReceiver(this.WifiRec, new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION));
  }


    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
        RemoteViews remoteViews;
    // Get all ids


        ComponentName thisWidget = new ComponentName(context,WifiWidget.class);
        int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
        for (int widgetId : allWidgetIds) { //update all instances
            wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            boolean bgData = mgr.getBackgroundDataSetting();
            int state = 10;
            state=wifi.getWifiState();

            remoteViews = new RemoteViews(context.getPackageName(),R.layout.main);
            //Logic
            if(state==3) { // currently enabled wifi
                turnOffWifi(context,bgData);
            }

            if(state==1) { // currently disabled wifi
                turnOnWifi(context);
            }

            if(state==4) {
                reportproblem(context);
            }
            //End Logic

            // Register an onClickListener

            Intent intent = new Intent(context, WifiWidget.class);

            intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

            PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            remoteViews.setOnClickPendingIntent(R.id.layout, pendingIntent);
            appWidgetManager.updateAppWidget(widgetId, remoteViews);
        }
    }

    public static void pushWidgetUpdate(Context context, RemoteViews remoteViews) {
        ComponentName myWidget = new ComponentName(context, WifiWidget.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(context);
        manager.updateAppWidget(myWidget, remoteViews);     
    }

    public void reportproblem(Context context) {
        updateText(context,"Error");
    }
    public void turnOnWifi(Context context) {
        updateText(context,"On");
        Toast.makeText(context, "Enabling Wifi", Toast.LENGTH_SHORT).show();
        wifi.setWifiEnabled(true);
    }
    public void turnOffWifi(Context context, boolean bgData) {
        updateText(context,"Off");
        Toast.makeText(context, "Disabling Wifi", Toast.LENGTH_SHORT).show();
        wifi.setWifiEnabled(false);
        if(bgData==true) {
            Intent sett  = new Intent("android.settings.SYNC_SETTINGS");
            sett.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(sett);
        }
    }
    public void updateText(Context context, String message) {
        RemoteViews remoteViews;
        remoteViews = new RemoteViews(context.getPackageName(),R.layout.main);
        remoteViews.setTextViewText(R.id.update,"Wi-Fi\n" + message);
        pushWidgetUpdate(context,remoteViews);
    }

    @Override
    public void onDeleted(Context context,int[] appWidgetIds) {
        //context.getApplicationContext().unregisterReceiver(WifiRec);
        //context.unregisterReceiver(WifiRec);

    }

    public void fromBRaction(Context context, Intent intent) {
        //Toast.makeText(context, "Something Changed", Toast.LENGTH_SHORT).show();
        wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        int state = 4;
        state=wifi.getWifiState();

        //Logic
        if(state==3) { // currently enabled wi-fi
            updateText(context,"On");
        }
        if(state==1) { // currently disabled wi-fi
            updateText(context,"Off");
        }
        if(state==4) { // Wi-fi Error
            updateText(context,"Error");
        }
        //End Logic
        //refresh / recall on-click listener
        RemoteViews remoteViews;
        remoteViews = new RemoteViews(context.getPackageName(),R.layout.main);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.layout, pendingIntent);
    }

    private  BroadcastReceiver WifiRec =  new BroadcastReceiver(){  
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
                fromBRaction(context,intent);
            }
        }
    };
}

thanks for any help. PS widget works beautifully except when deleted.

While StinePike's answer is tactically correct, you have larger problems: your registered receiver will go away fairly quickly. You cannot register a BroadcastReceiver dynamically from another BroadcastReceiver , as once your process is terminated, the dynamic BroadcastReceiver is gone.

Instead, register your WIFI_STATE_CHANGED_ACTION receiver in the manifest. When you want to enable or disable receipt of this broadcast, use PackageManager and setComponentEnabledSetting() to enable and disable the receiver.

Thar part is commented in your code

   unregisterReceiver(WifiRec);

This is for unregistering a receiver.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM