Как отменить регистрацию приемника вещания в классе приложений?

Я регистрирую широковещательный приемник в классе приложений Android, но теперь мой вопрос - где отменить регистрацию этой трансляции?

public class MyApplication extends Application 

{

@Override
public void onCreate() {
     ..... 
     // OTHER INITIALIZATIONS
     initNetworkBR();
} 
private void initNetworkBR() {

      br = new BroadcastReceiver() {
        ....
      };
      IntentFilter filter = new IntentFilter();
      filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
      registerReceiver(br, filter);
   }
}

8 ответов

Решение

Одно из предложений - в вашей активности запуска или желаемой активности отмените регистрацию, например:

@Override
protected void onDestroy() {
    super.onDestroy();
    ((MyApplication) getApplication()).unregisterReceiver();
}

И реализовать unregisterReceiver метод в MyApplication учебный класс:

public void unregisterReceiver() {
     unregisterReceiver(br);//your broadcast
}

Как упоминалось выше @Naruto Uzumaki, вы можете отменить его регистрацию наonDestroyспособ применения. Но всегда лучше использовать Broadcast Receiversin Activity вместо всего приложения.

Вы можете использовать следующий подход, чтобы использовать его в действии:-

      public class DetailsActivity {

private BroadcastReceiver mNetworkReceiver;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
    mNetworkReceiver = new NetworkReceiver();
    registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
 }

Вот способ отменить регистрацию.

       @Override
 protected void onDestroy() {
    super.onDestroy();
    unregisterNetworkChanges();
 }

 protected void unregisterNetworkChanges() {
    try {
        unregisterReceiver(mNetworkReceiver);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    }
  }

Я использую Application.ActivityLifecycleCallbacks, которые прослушивают все обратные вызовы из жизненного цикла действий. Это может заменить предложение использовать базовую активность с использованием наследования и, с другой стороны, использовать композицию для решения этой проблемы.

Вы реализуетеApplication.ActivityLifecycleCallbacksинтерфейс в классе и при создании из вашего класса приложения зарегистрируйте обратный вызов как continue:

      registerActivityLifecycleCallbacks(<here your typed class with ActivityLifecycleCallbacks>)

Затем у вас есть полный контроль над жизненным циклом всех действий, чтобы делать что-то вроде отмены регистрации или регистрации получателей.

Я надеюсь, что это может быть полезно

Я думаю, что вы должны использовать LocalBroadcastManager зарегистрировать и отменить регистрацию получателя вместо BroadcastReceiver,

Преимущества использования LocalBroadcastManager

@Override
public void onCreate(Bundle savedInstanceState) {

  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
      new IntentFilter("custom-event-name"));
}

@Override
protected void onDestroy() {
  // Unregister since the activity is about to be closed.
  LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
  super.onDestroy();
}

Кроме использования Broadcast Receiver в классе Application, вы можете использовать базовый класс для всех ваших действий. И зарегистрируйте BR в Базовом занятии, затем предоставьте обратные вызовы детям. Поскольку Activity имеет строгую модель жизненного цикла, поэтому лучше использовать приемники Runtime Broadcast в классе Activity, а не в классе Application.

 public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onResume() {
        super.onResume();
        //registerReceiver Here
    }

    @Override
    protected void onPause() {
        super.onPause();
        //unregisterReceiver here
    }
}

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

правильный ответ для закрытия широковещательного приемника здесь, я получил его от других ответов stackru.

@Override
protected void onDestroy() {
  try{this.unregisterReceiver(mMessageReceiver)}catch(Exception e){}
  super.onDestroy();
}

с кодом выше мы уверены, что наш приемник будет закрыт, если он все еще работает.

эта часть кода всегда должна быть помещена в try/catch

this.unregisterReceiver(mMessageReceiver)

Попробуйте с кодом ниже:
если вы зарегистрировались в Manifyt.xml

ComponentName component = new ComponentName(context, MyReceiver.class);

    int status = context.getPackageManager().getComponentEnabledSetting(component);
    if(status == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
     context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED , PackageManager.DONT_KILL_APP);
    }

Если программно регистрируется приемник:

@Override
public void onCreate(Bundle savedInstanceState) {

  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
      new IntentFilter("custom-event-name"));
}

@Override
protected void onDestroy() {
  // Unregister since the activity is about to be closed.
  LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
  super.onDestroy();
}

Вы должны использовать unregisterReceiver(получатель BroadcastReceiver) в onPause() для отмены регистрации получателя Broadcast.

Пример:

public class MyActivity extends Activity {
  private final BroadcastReceiver mybroadcast = new SmsBR();

  public void onResume() {
    super.onResume();

    IntentFilter filter = new IntentFilter();
    filter.addAction("android.provider.Telephony.SMS_RECEIVED");
    registerReceiver(mybroadcast, filter);
  }

  public void onPause() {
    super.onPause();

    unregisterReceiver(mybroadcast);
  }
}
Другие вопросы по тегам