Как отменить регистрацию BroadcastReceiver в AppWidgetProvider? - PullRequest
0 голосов
/ 29 июня 2018

Я объявляю широковещательный приемник в моем методе AppWidgetProvider onUpdate (). Приемник вещания будет прослушивать изменения подключения.

IntentFilter intentFilter = new IntentFilter(connectivityChange);
context.getApplicationContext().registerReceiver(mReceiver, intentFilter);

Создается ли новый broadcastReceiver каждый раз, когда запускается мой метод onUpdate ()?

Если так, как мне отменить регистрацию предыдущей трансляции, чтобы у меня не было десятков широковещательных приемников?

context.getApplicationContext().unregisterReceiver(mReceiver);

не работает, так как AppWidgetProvider теряет экземпляр mReceiver.

РЕДАКТИРОВАТЬ: я не могу объявить получателя в манифесте, так как действие изменения подключения было отключено в манифесте для самых последних уровней Android API, поэтому я должен зарегистрировать его программно

Ответы [ 2 ]

0 голосов
/ 05 августа 2018

Это действительно плохая идея прослушивать изменения подключения в AppWidgetProvider, потому что у него такое же время жизни, как у BroadcastReceiver. AppWidgetProvider - это BroadcastReceiver на стероидах, но если вы динамически зарегистрируете приемник в onEnabled (), ваш экземпляр AppWidgetProvider будет работать очень скоро, поэтому через некоторое время вы не получите никаких реальных обратных вызовов изменений подключения. Лучший вариант вы можете найти здесь .

0 голосов
/ 29 июня 2018

Решение: Ответ. Да, регистрация BroadcastReceiver в onUpdate (), будет регистрировать новый каждый раз. Я решил проблему создания слишком большого числа приемников Broadcast, создав его в OnEnabled (), поскольку этот код запускается только при создании первого виджета.

Вот как я планирую отменить регистрацию broadcastReceiver, который я создал в onEnabled. Я добавлю фильтр намерений: ACTION_APPWIDGET_DISABLED в broadcastReceiver при его регистрации. В методе OnReceive () пользовательского broadcastReceiver я выполню:

@Override
public void onReceive(Context context, Intent intent){
    if(intent.getAction().equals("ACTION_APPWIDGET_DISABLED"){
        context.unregisterReceiver(this);
    }
    else{
        ...
        //Rest of my method
    {

{
...