2013-06-28 3 views
0

Я создал базовый виджет Wi-Fi. Единственная проблема заключается в том, что он продолжает прослушивать изменения Wi-Fi даже после того, как я удалил/удалил виджет с экрана. Как я могу остановить это без силового закрытия/сбоя (угадать, не регистрировать ресивер), или я использую приемник вещания неправильно?Как отменить регистрацию широковещательного приемника в Android

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

благодарит за любую помощь. Виджет PS прекрасно работает, кроме случаев, когда он удален.

ответ

0

Тары часть комментируется в коде

unregisterReceiver(WifiRec); 

Это для приемника регистрации.

+0

, но это вызывает ошибку, и мне нужно принудительно закрыть. – alex

+0

@alex пожалуйста, проверьте детали CommonsWare .. это описано четко. Мой ответ просто рассмотрел, как отменить регистрацию приемника ... – stinepike

2

Хотя ответ StinePike тактичен, у вас большие проблемы: ваш зарегистрированный приемник будет довольно быстро уходить. Вы не можете динамически регистрировать BroadcastReceiver от другого BroadcastReceiver, так как как только ваш процесс завершается, динамический BroadcastReceiver ушел.

Вместо этого зарегистрируйте приемник WIFI_STATE_CHANGED_ACTION в манифесте. Если вы хотите включить или отключить получение этой трансляции, используйте PackageManager и setComponentEnabledSetting() для включения и выключения ресивера.

+0

просвещен как обычно :) .. – stinepike

+0

@StinePike: Спасибо! Хотя я бы хотел, чтобы мои объяснения были такими короткими, как ваши ... :-) – CommonsWare