BroadcastReceiver как внутренний класс - PullRequest
12 голосов
/ 31 января 2011

Я знаю, что BroadcastReceiver нельзя использовать, если он определен как внутренний класс Activity. Но мне интересно, почему? Это потому, что система должна была создать экземпляр большого объекта Activity, чтобы просто создать экземпляр получателя?

1 Ответ

26 голосов
/ 31 января 2011

... потому что система должна была бы создать экземпляр большого объекта Activity, чтобы просто создать экземпляр получателя?

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

Глобальные широковещательные приемники, которые вызываютсяиз намерений в файле манифеста, которые будут автоматически создаваться системой, нет такого внешнего экземпляра, который можно использовать для создания экземпляра нестатического внутреннего класса получателя вещания.Это не зависит от того, что представляет собой внешний класс, «Активность» или «нет».

Однако, если вы используете приемник как часть работы с действием, вы можете вручную создать экземпляр широковещательного приемника в действии (пока одиниз обратных вызовов действий у вас есть экземпляр внешнего класса, с которым нужно работать: this), а затем зарегистрируйте / отмените его регистрацию соответствующим образом:

public class MyActivity extends Activity {

    private BroadcastReceiver myBroadcastReceiver =
        new BroadcastReceiver() {
            @Override
            public void onReceive(...) {
                ...
            }
       });

    ...

    public void onResume() {
        super.onResume();
        ....
        registerReceiver(myBroadcastReceiver, intentFilter);
    }

    public void onPause() {
        super.onPause();
        ...
        unregisterReceiver(myBroadcastReceiver);
    }
    ...
}
...