Как отменить регистрацию приемника вещания в классе приложений?
Я регистрирую широковещательный приемник в классе приложений 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);
}
}