简体   繁体   English

如何取消注册Android中的广播接收器

[英]How to unregister a broadcast receiver in Android

I've created a basic wifi widget. 我已经创建了一个基本的wifi小部件。 The only problem is that it keeps listening for wifi changes even after I've removed/deleted the widget from the screen. 唯一的问题是,即使我从屏幕上删除/删除了小部件,它仍会继续监听wifi的变化。 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. PS小部件工作得很漂亮,除非被删除。

While StinePike's answer is tactically correct, you have larger problems: your registered receiver will go away fairly quickly. 虽然StinePike的答案在战术上是正确的,但你遇到了更大的问题:你的注册接收器会很快消失。 You cannot register a BroadcastReceiver dynamically from another BroadcastReceiver , as once your process is terminated, the dynamic BroadcastReceiver is gone. 您无法从另一个BroadcastReceiver动态注册BroadcastReceiver ,因为一旦您的进程终止,动态BroadcastReceiver就会消失。

Instead, register your WIFI_STATE_CHANGED_ACTION receiver in the manifest. 而是在清单中注册您的WIFI_STATE_CHANGED_ACTION接收器。 When you want to enable or disable receipt of this broadcast, use PackageManager and setComponentEnabledSetting() to enable and disable the receiver. 如果要启用或禁用此广播的接收,请使用PackageManagersetComponentEnabledSetting()来启用和禁用接收器。

Thar part is commented in your code Thar部分在您的代码中注释

   unregisterReceiver(WifiRec);

This is for unregistering a receiver. 这是用于取消注册接收器。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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