Подтвердить что ты не робот

BroadcastReceiver как внутренний класс

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

4b9b3361

Ответ 1

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

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

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

Однако, если вы используете приемник как часть работы с активностью, вы можете вручную создать экземпляр широковещательного приемника самостоятельно (хотя в одном из обратных вызовов активности у вас есть экземпляр внешнего класса для работы с: 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);
    }
    ...
}