Я создал базовый виджет 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 прекрасно работает, кроме случаев, когда он удален.
, но это вызывает ошибку, и мне нужно принудительно закрыть. – alex
@alex пожалуйста, проверьте детали CommonsWare .. это описано четко. Мой ответ просто рассмотрел, как отменить регистрацию приемника ... – stinepike