Регистрация и отмена регистрации BroadcastReceiver в классе приложений

У меня есть широковещательный приемник, который зарегистрирован в методе onCreate() класса Android Applcation, но как отменить его регистрацию

пример

public class MyApplication extends Application {


@Override
public void onCreate() {
    super.onCreate();
    registerReceiver(broadcastReceiver, new IntentFilter("TIMEZONE_CHANGED"));
}

В приведенном выше коде я зарегистрировал его в методе onCreate() приложения, и в классе Application нет метода onDestroy()/onStop() для отмены регистрации BroadReceiver.

Как этого добиться


person Anbu    schedule 17.08.2017    source источник
comment
проверьте: Application.ActivityLifecycleCallbacks: ссылка: developer.android.com/reference /андроид/приложение/   -  person Bapusaheb Shinde    schedule 17.08.2017


Ответы (5)


Вам не нужно отменять регистрацию, если вы хотите слушать все время работы приложения. Из документов (на сегодняшний день):

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

(https://developer.android.com/guide/components/broadcasts.html)

person Brian Yencho    schedule 19.03.2018
comment
Большое спасибо за ссылку на документ ... Это должен быть принятый ответ. - person Hrishikesh Kadam; 25.04.2018

вы должны создать BaseActivity.

Пример

public class BaseActivity extends AppCompatActivity {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    registerReceiver(broadcastReceiver, new IntentFilter("TIMEZONE_CHANGED"));
}

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

И MainActivity расширяет BaseActivity

пример:

public class MainActivity extends BaseActivity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}
}
person Nguyễn Trung Hiếu    schedule 17.08.2017
comment
Спасибо, я делаю это, но отмена регистрации происходит каждый раз, когда я убиваю приложение, которое мне нужно, чтобы приложение прослушивалось, даже когда оно находится в фоновом режиме. - person Anbu; 28.08.2017

Вы можете вызвать отмену регистрации приемника внутри класса приложения, только вы просто вызываете это

в вашей MainActivity внутри вызова метода onDesctroy()

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

мы создаем метод unregisterReceiver() в вашем классе MyApplication

 public class MyApplication extends Application {


    @Override
    public void onCreate() {
        super.onCreate();
        registerReceiver(broadcastReceiver, new IntentFilter("TIMEZONE_CHANGED"));
    }

public void unregisterReceiver() {
     unregisterReceiver(broadcastReceiver);
}
person Mohit Suthar    schedule 17.08.2017
comment
Это нормально, но я должен показать диалоговое окно оповещения, когда часовой пояс изменился, где мне нужно передать ему контекст активности, поэтому, как я это сделаю - person Anbu; 28.08.2017
comment
Во-первых, вам нужно обновить свой вопрос, в чем именно ваша проблема - person Mohit Suthar; 28.08.2017

позвоните туда, где вы хотите отменить регистрацию

unregisterReceiver();
person Anshul..    schedule 17.08.2017

Пожалуйста, используйте статически зарегистрированные широковещательные приемники в своем манифесте, которые не требуют от вас вызова registerReceiver() и unRegisterReceiver()

<receiver
   android:name=".MyTimeChangeReceiver">
   <intent-filter>
        <action android:name="android.intent.action.TIMEZONE_CHANGED" />
        <action android:name="android.intent.action.TIME_SET" />
    </intent-filter>
</receiver>
person Girish H    schedule 17.08.2017
comment
Это не будет работать в Android API 26+: developer.android.com/ о/версии/oreo/ - person Mira_Cole; 05.04.2018